链接一个C++;具有非C++;主要功能 给出了一些C++函数(使用STL),你能从一个程序中使用这些函数吗?这个程序没有用C++编译器编译过。你能避免将程序与C++编译器连接吗?

链接一个C++;具有非C++;主要功能 给出了一些C++函数(使用STL),你能从一个程序中使用这些函数吗?这个程序没有用C++编译器编译过。你能避免将程序与C++编译器连接吗?,c++,c,dll,shared-libraries,C++,C,Dll,Shared Libraries,我知道接口必须是外部的“C”函数,它们不应该抛出异常 通过搜索web,我发现许多来源暗示这是不可能的,例如: 因此,运行LD链接C++程序或库被认为是失败的。 “调用C++库的C主程序从一开始就不好” 但我也发现: 我的理解是这样的:解决方法是只构建一个共享库。 使用C++编译器链接共享库,共享库本身就是一种“程序”(具有启动/拆卸功能,如DLLmain,而不是正常的main函数)。使用共享库的程序不需要知道它是一个C++库。 我理解对了吗 有捕获物吗 编辑1:我试过了-成功了。我用l

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

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

  • 因此,运行LD链接C++程序或库被认为是失败的。
  • “调用C++库的C主程序从一开始就不好”
但我也发现:

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

有捕获物吗

编辑1:我试过了-成功了。我用libtool建立了我的共享库, 并且可以通过与一个普通的

cc c_main_program.o -lmy_cpp_library -o c_main_program
在成功的实验后更新了问题:是否有可以
稍后让我大吃一惊(例如在其他平台上,或者当我在全局变量中使用构造函数时,…)

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

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

c没有这样的问题c函数有一个定义的接口,数据类型的布局也是众所周知的,所以从单独的编译器动态加载没有问题。但这意味着您只能使用c的类型和特性


<>更详尽的讨论,检查< /P>什么是全局对象的构造函数和析构函数?首先,它们将非常难以在非C++程序中访问,因为必须将它们进行外部化,并找到符号,然后如何访问函数几乎是不可能的。但是它们肯定会被你的函数使用,而不是被客户端使用。因此,如果你链接到一个C程序并调用
compute()
,你希望它返回正确的值吗?什么会导致调用构造函数?是的。在dllmain之前初始化这是来自dllmain文档“如果您的DLL与C运行时库(CRT)链接”对于CRT,入口点由CRT提供全局和静态C++对象的构造函数和析构函数。因此,DLLMIN的这些限制也适用于构造函数和析构函数以及从它们调用的任何代码。看来你是对的。。。我在后台做了一些测试,我很确定那是行不通的。