我正在尝试使用MS Visual Studio 2012创建一个静态库,MinGW可以将其链接到(我正在使用Code :: Blocks处理此过程的MinGW端)。
为避免name-mangling问题,库接口在extern "C"
块中声明,仅使用data types common to both C and 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"
来防止名称错位问题,但由于这是我第一次尝试创建一个与交叉编译器兼容的库,我可能错过了其他的东西。
非常感谢任何建议或意见!
答案 0 :(得分:0)
我会说微软编译器需要__declspec(dllexport)!
这是一个msdn链接:
https://msdn.microsoft.com/en-US/en-en/library/a90k134d.aspx