将C ++库链接到具有非C ++主函数的程序

时间:2012-10-03 23:05:52

标签: c++ c dll shared-libraries

考虑到一些C ++函数(使用STL),你能从一个没有用C ++编译器编译的主函数的程序中使用它们吗?你能避免将该程序与C ++编译器联系起来吗?

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

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

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

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

我理解正确吗?

有捕获吗?

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

来使用它
cc c_main_program.o -lmy_cpp_library -o c_main_program
成功实验后,

更新了问题:是否有任何捕获可以 后来让我感到惊讶(例如在其他平台上,或者当我在全局变量中使用构造函数时......)

1 个答案:

答案 0 :(得分:2)

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

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

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

更详尽的讨论请查看this