1

给定一些 C++ 函数(使用 STL),您可以在具有未使用 C++ 编译器编译的 main 函数的程序中使用它们吗?你能避免将该程序与 C++ 编译器联系起来吗?

我知道接口必须是外部“C”函数并且它们不应该抛出异常。

通过搜索网络,我发现许多来源暗示这是不可能的,例如:

但我也发现了这个: http ://wewantarock.wordpress.com/2010/11/01/working-around-the-static-libstdc-restriction/

我是这样理解的:解决方法是构建一个共享库。您使用 C++ 编译器链接共享库,而共享库本身就是一种“程序”(具有 DLLMain 之类的启动/拆卸函数,而不是普通的 main 函数)。使用共享库的程序不需要知道它是一个 C++ 库。

我理解正确吗?

有什么问题吗?

编辑1:我试过了 - 成功。我用 libtool 构建了我的共享库,并且可以通过与普通的链接来使用它

cc c_main_program.o -lmy_cpp_library -o c_main_program

更新的问题,在成功的实验之后:是否有任何让我感到惊讶的问题(例如在其他平台上,或者当我在全局变量中使用构造函数时,......)

4

1 回答 1

2

只要您导出接口是使用已知调用约定的直接 c 函数,在内部使用 STL 就没有问题。Dll 已经构建,不需要调用链接器或编译器来使用它们。

c++ 的问题在于 c++ 的二进制格式依赖于实现,因此无法保证使用不同编译器构建的源代码兼容代码将是二进制兼容的。链接模板存在单独的问题,因为库中仅包含模板的实例化具体版本,编译器必须查看模板的定义以避免两次声明它(对于大多数编译器)。

c 没有此类问题 c 函数具有已定义的接口,并且数据类型的布局也是已知的,因此从单独的编译器动态加载没有问题。但这意味着你只能使用 c 的类型和特性。

有关更详尽的讨论,请查看

于 2012-10-03T23:20:27.310 回答