我正在尝试使用MS Visual Studio 2012创建一个静态库,MinGW将能够链接到它(我正在使用Code::Blocks处理此过程的MinGW端)。
为了避免名称混淆问题,库接口在
该库文件是在VS 2012中从两个文件LibTest.h和LibTest.cpp编译的(这些是展示问题的简化示例)。
当我尝试编译这个库时,进程失败并显示了一个未定义的引用错误(与尝试链接名称混淆的库生成的相同错误)。我期望使用
为了避免名称混淆问题,库接口在
extern "C"
块中声明,并仅使用C和C ++通用的数据类型。尽管采取了这些预防措施,但MinGW在尝试编译连接到库的项目时会出现未定义的引用错误。该库文件是在VS 2012中从两个文件LibTest.h和LibTest.cpp编译的(这些是展示问题的简化示例)。
// LibTest.h
#ifndef LIBTEST_H
#define LIBTEST_H
extern "C" {
int Test(int input);
}
#endif
// LibTest.cpp
#include "LibTest.h"
extern "C" {
int Test(int input){
return (input + 5);
}
}
VS 2012将其编译为静态库(LibTest.lib),没有任何投诉。我的MinGW测试程序如下:
// LibTest.lib is linked in the project settings
#include "LibTest.h" // Same LibTest.h as above
int main(){
int x = 5;
int a = Test(x);
return 0;
}
当我尝试编译这个库时,进程失败并显示了一个未定义的引用错误(与尝试链接名称混淆的库生成的相同错误)。我期望使用
extern "C"
可以防止名称混淆问题,但由于这是我第一次尝试创建跨编译器兼容的库,我可能错过了其他内容。非常感谢任何建议或评论!
dumpbin /symbols LibTest.lib
的输出内容可能会很有教育意义,因为我们可以看到MSVC创建的库中有哪些名称。 - Michael Burrobj\Release\main.o:main.cpp (.text+0x16): undefined reference to Test
。dumpbin /symbols
的输出只是“文件类型:库”。有趣的是,当在 LibTest.lib 上运行reimp
时也没有产生任何输出。 - Reign of Errorextern "C"
块以防止它们引起问题)时,构建失败并显示“error LNK2001: unresolved external symbol "int __cdecl Test(int)" (?Test@@YAHH@Z)”错误。我不确定库有什么问题;我创建它的过程与此处详细描述的过程相匹配。 - Reign of Errorcl /c libtest.cpp && lib libtest.obj
,会发生什么? - Michael Burr