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

时间:2012-08-20 15:06:57

标签: c++ c windows swig

假设我有两个项目要联系在一起:

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

我意识到没有标准的C ++ ABI,任何将这两个C ++项目直接链接在一起的尝试都会失败。什么是创建兼容性层的好的,自动化的方式,允许我完成这个?

例如,可以想象C ++库可以通过C接口暴露自己。然后,可执行文件将包含一些C ++类,这些类包装C ++库公开的C接口。由于 是C的标准ABI,它可以工作。

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

或者我是以错误的方式解决这个问题?

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

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

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

如果您想手动执行此操作(创建自己的类似COM的库),可能需要认真考虑很多棘手的问题。你需要一个跨模块的RTTI系统,你需要一个接口查询/定义协议,一些管理模块内存的机制等等。除此之外,为了“自动化”它,你可能需要组合MACRO和模板元函数。

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

我确信还有很多其他类似的库。但第一个问题当然是,你真的需要这个吗?你可能正在用火箭筒杀死一只苍蝇。

答案 2 :(得分:0)

为什么不用C ++构建器编译库呢?

答案 3 :(得分:0)

环顾swig(我知道swig应该能够用C语言包装C ++): SWIG and C++

答案 4 :(得分:0)

如果核心库是跨平台的,为什么不将UI编写为跨平台的Qt应用程序,并在Windows上用Visual C ++构建所有内容。