混合来自不同编译器的C++代码

Mixing C++ code from different compilers

本文关键字:C++ 代码 编译器 混合      更新时间:2023-10-16

假设我有两个项目要链接在一起:

  • 用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++构建所有内容呢。