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

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

  • 用Visual C ++编译成DLL文件的C ++库。
  • 用C ++ Builder编译的C ++可执行文件,使用库中的类。

我意识到没有标准的C ++ ABI,并且任何直接将这两个C ++项目链接在一起的尝试都将失败。 什么是创build兼容性层的好的自动化方法,可以让我完成这个任务?

例如,可以想象C ++库可以通过C接口来暴露自己。 然后,可执行文件将包含一些C ++类,它们包装C ++库公开的C接口。 因为C有一个标准的ABI,所以它可以工作。

唯一的问题是如何自动创buildC接口和C ++包装类 – 手动维护这不会是一个选项。 SWIG项目看起来很有希望,但不幸的是,C ++并不是在他们的网站上列出的SWIG的出口之一。 有没有办法用SWIG来做我想要的? 或者除了SWIG以外,还有另一个项目可以帮助我完成这个任务吗?

或者我正在做这个错误的方式?

编辑:核心C ++库旨在跨平台。 显然,可执行文件是Windows特有的。 我不想污染核心库,以至于无法在其他平台上进行编译。

Solutions Collecting From Web of "混合来自不同编译器的C ++代码"

如果只需要在Windows上运行,我会将这些类作为COM对象公开。 他们仍然在一个DLL中,他们可以被任何懂得COM的语言使用。

在Windows中这样做的“标准”方法是使用COM对象。 所以,这当然是一个很好的选择。 在Linux系统中,模块交互模型(例如,可执行的DLL交互)是非常不同的,ABI存在于C ++中。

如果你想这样做手动(创建自己的类COM库),它可以很多工作与许多小棘手的问题,认真对待。 你需要一个跨模块的RTTI系统,你需要一个接口查询/定义协议,一些模块管理内存的机制等。除此之外,要“自动化”它,你可能需要结合使用MACRO和模板元函数。

我强烈建议您考虑或至少查看一个跨平台的选项是使用Boost.Python和Python语言作为模块之间的“粘合剂”。 Boost.Python库基本上完成了“自动导出/导入类”的功能,但是它将C ++类和函数导出为Python类和函数。 而且,这是完全非侵入式和跨平台的,所以这实际上是一个自动输出的理想例子。 因此,您可以考虑使用Python来编写高级别的胶合代码,或者使用Python作为C ++模块之间的中介,甚至可以重新编写Boost.Python库以仅使用“自动导出”机制来导出到任何接口你设计或使用的系统。

我确定有很多其他类似的图书馆。 但是,头号问题当然是你真的需要这个吗? 你可能正在使用火箭筒杀死一只苍蝇。

为什么不用C ++ builder编译库呢?

看看swig(我知道swig应该能够用C封装C ++): SWIG和C ++

如果核心库是跨平台,为什么不把它编写成一个跨平台的Qt应用程序,并在Windows上的Visual C ++中构建一切。