15

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

  • 使用 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 的。我不想将核心库污染到无法在其他平台上编译的程度。

4

5 回答 5

5

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

于 2012-08-20T15:17:23.867 回答
4

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

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

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

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

于 2012-08-20T15:37:49.647 回答
0

为什么不直接用 C++ builder 编译这个库呢?

于 2012-08-20T15:37:23.693 回答
0

环顾 swig(我知道 swig 应该能够在 C 中包装 C++): SWIG 和 C++

于 2012-08-20T15:39:30.833 回答
0

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

于 2012-08-20T16:03:59.730 回答