使用g ++链接到C ++ DLL的C ++库

时间:2011-02-20 03:55:31

标签: c++ c dll g++ static-linking

我已经看到了C库链接到C ++或链接到C的C ++库的人们的许多问题和答案...但是我有一个C ++库链接到C ++,并且我得到的结果与混合C和C的人一样C ++在一起(链接期间未定义的引用)。

这是我的g ++专栏:

g++ -L C:/MyLibraries mycode.cpp -shared -o mycode.dll -lopengl32 -lglu32 -lgdi32 -lMyLibrary

到目前为止,我遇到的每个答案都谈到了如下我的标题:

#ifdef __cplusplus
extern "C" {
#endif
...
#ifdef __cplusplus
}
#endif

但是,我的库是纯C ++,100%类,没有全局函数,没有外部“C”可以写入(不能在类中的方法上使用“C”,并包装整个类与extern“C”没有任何关系......链接时仍然未定义引用。

MyLibrary.lib是在Visual Studio 2010中编写的。而且,我使用Visual Studio 2005和2008编写了许多库。没有一个人需要将extern“C”添加到其中任何一个以静态链接到其他Visual Studio基础项目。 C ++库链接到其他C ++项目,没有任何问题。

这是Visual Studio负责的东西吗?g ++没有?我可以将大量自己的C ++自定义静态库静态链接到其他C ++项目中,它只是起作用。 Visual Studio是否足够聪明,可以破译它自己的C ++方法名称,所以直到现在我还没有遇到过这种情况?但是g ++不知道该怎么做,强制要求C命名约定(尽管我的所有目标都是100%C ++)?

或者问题是即使我使用g ++,它仍然执行一些标准的C规则?我的g ++命令行出了什么问题?

即使在MSDN上寻找导出dll函数的答案,也会让我看起来更像是我的g ++系列出了问题,因为它们的链接有诸如“将C函数导出到C ++可执行文件”和“导出C ++”等主题函数到C可执行文件“,没有任何链接”将C ++函数导出到C ++可执行文件中“在任何地方提到...我在我的函数上尝试了__declspec(dllexport),这些函数已编译,但仍然未定义与g ++的链接。有什么想法吗?

谢谢。

1 个答案:

答案 0 :(得分:7)

Visual Studio和g ++对名称修改,vtable布局等使用非常不同的约定,因此将用它们构建的库链接在一起是不安全的(除了它们只通过C接口进行通信时)。 MinGW网站上的http://www.mingw.org/wiki/MixingCompilers有更多信息。