混合来自不同编译器的C++代码
Mixing C++ code from different compilers
假设我有两个项目要链接在一起:
- 用Visual C++编译为DLL文件的C++库
- 使用C++编译器编译的C++可执行文件,它使用库中的类
我意识到没有标准的C++ABI,任何将这两个C++项目直接连接在一起的尝试都将失败。什么是创建兼容性层的好的、自动化的方法,可以让我实现这一点?
例如,可以想象,C++库可以通过C接口公开自己。然后,可执行文件将具有一些C++类,这些类封装C++库公开的C接口。由于是C的标准ABI,所以它会起作用。
唯一的问题是如何自动创建C接口和C++包装类——手动维护这不是一个选项。SWIG项目看起来很有希望,但不幸的是,C++并不是他们网站上列出的SWIG的出口之一。有没有办法用SWIG做我想做的事?或者,除了SWIG之外,还有其他项目可以帮助我完成这项任务吗?
还是我走错了路?
编辑:核心C++库旨在实现跨平台。显然,可执行文件是特定于Windows的。我不想把核心库污染到无法在其他平台上编译的程度。
如果它只需要在Windows上运行,我会将类公开为COM对象。它们仍然在DLL中,并且可以被任何理解COM.
在Windows中,执行此操作的"标准"方法是使用COM对象。因此,这当然是一个很好的选择。在Linux系统中,模块交互模型(例如,可执行DLL交互)非常不同,C++中存在ABI。
如果你想手动完成这项工作(创建你自己的类似COM的库),这可能是一项艰巨的工作,需要认真对待许多棘手的问题。您需要一个跨模块的RTTI系统,需要一个接口查询/定义协议,一些跨模块管理内存的机制,等等。除此之外,要"自动化"它,您可能需要MACRO和模板元函数的组合。
我强烈建议您考虑或至少考虑的一个跨平台选项是使用Boost.Python和Python语言作为模块之间的"粘合剂"。Boost.Python库基本上完成了整个"类的自动导出/导入",但它将C++类和函数导出为Python类和函数。而且,它是完全非侵入性和跨平台的,所以这确实是自动导出的一个理想例子。因此,您可以考虑使用Python来编写高级粘合代码,或者使用Python作为C++模块之间的中间层,甚至可以重新设计Boost.Python库,使其仅使用"自动导出"机制来导出到您设计或使用的任何接口系统。
我相信还有很多其他类似的图书馆。但首要的问题是,当然,你真的需要这个吗?你可能在用火箭筒杀死一只苍蝇。
为什么不使用C++构建器编译库呢?
环顾swig(我知道swig应该能够将C++封装在C中):SWIG和C++
如果核心库是跨平台的,为什么不将UI编写为跨平台的Qt应用程序,并在Windows上用Visual C++构建所有内容呢。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值