【发布时间】:2012-08-20 15:06:56
【问题描述】:
假设我有两个项目想要链接在一起:
- 使用 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 的。我不想将核心库污染到无法在其他平台上编译的程度。
【问题讨论】:
-
+1 努力让您的核心业务逻辑跨平台。
-
我们讨论了多少类/方法。采用指向 C++ 类的不透明指针并调用 C++ 方法的 C 填充程序并不困难,尽管我承认它可能会变得乏味。
-
对于初始项目 - 类不多。然而,将其视为一个更大项目的实践。该项目最终将涉及大量后端类移入核心 C++ 库。我认为那时我们需要自动生成代码。我同意编写 C 垫片很容易。只是最终手动维护的会太多。
-
跨平台和交叉编译器是不同的东西。在你的问题中具体。我可能是“跨平台的”,如果我对给定平台上的所有库/可执行文件使用相同的编译器,那么你的问题没有实际意义。
-
@Josh Petitt:核心逻辑最终应该在任何操作系统、任何 C++11 编译器上运行。用户界面代码可能更灵活——目前是 C++ 和 VCL。它可能特定于一个编译器/操作系统,或者可能更通用。稍后,它需要灵活地定位用户界面,如 Qt、.NET WPF(我认为 SWIG 可以提供帮助)、其他原生小部件工具包 - 谁知道 5 年后下一个流行的小部件工具包会是什么?我们希望做好准备。