为 C++ 库创建自动 C 包装器?

Ser*_*rov 5 c c++ abi wrapper

假设我有一个 C++ DLL。AFAIK,C++ 没有广泛采用的 ABI 标准,因此为了确保它工作并且不依赖于目标应用程序的编译器,我需要将我的库包装在 C 接口中。

有没有什么工具可以自动生成这样的界面?如果他们可以围绕 C 接口生成包装器,看起来好像它们是原始的 C++ 对象,那也会很好,例如

Foo* f = new Foo();  // FooWrapper* fw = Foo_create();
f->bar("test");      // Foo_bar(fw, "test")
Run Code Online (Sandbox Code Playgroud)

转换为使用生成的 C ABI 在我的库中调用的 C 函数。我知道 C++ 是相当复杂的语言,并不是所有的东西都可以很容易地包装在 C 接口中,但我想知道是否有任何这样的解决方案甚至支持 C++ 语言的一个子集(也许在一些手动编写的 IDL/ XML 文件)?

Mat*_*son 3

C++ 没有广泛采用的 ABI 标准

我很确定这有点夸张 - 没有那么多不同的编译器可用于任何给定的平台,因此为每个供应商生成一个 DLL 可能会更容易(例如 Microsoft、Windows 上的 GCC、Linux 上的 GCC) ,Sun 和 GCC for Solaris,GCC for MacOS - 据我所知,CLANG 与 GCC 兼容)。

添加 C 层接口基本上意味着接口层不得: 1. 使用任何需要特殊复制/赋值/构造行为的对象。2. 使用任何“抛出”异常。3.使用虚函数。穿过该界面。

我认为“修复”由于“缺乏 ABI”而导致的问题比制作一个适合 C++ 使用的好接口并中间有一个 C 接口更容易。