Visual c++ 创建一个MinGW可以链接的MSVC库
我正在尝试使用MS Visual Studio 2012创建一个静态库,MinGW将能够链接到该库(我正在使用Code::Blocks处理此过程的MinGW端) 为了避免出现问题,库接口在Visual c++ 创建一个MinGW可以链接的MSVC库,visual-c++,mingw,static-libraries,name-mangling,Visual C++,Mingw,Static Libraries,Name Mangling,我正在尝试使用MS Visual Studio 2012创建一个静态库,MinGW将能够链接到该库(我正在使用Code::Blocks处理此过程的MinGW端) 为了避免出现问题,库接口在extern“C”块中声明并仅使用。尽管有这种预防措施,但在试图编译链接到库的项目时,MinGW会给出未定义的引用错误 该库文件是在VS 2012中从两个文件LibTest.h和LibTest.cpp编译而成的(这些是显示问题的简化示例) VS2012将其编译为一个静态库(LibTest.lib),没有任何问
extern“C”
块中声明并仅使用。尽管有这种预防措施,但在试图编译链接到库的项目时,MinGW会给出未定义的引用错误
该库文件是在VS 2012中从两个文件LibTest.h和LibTest.cpp编译而成的(这些是显示问题的简化示例)
VS2012将其编译为一个静态库(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”
来防止名称损坏问题,但由于这是我第一次尝试创建一个与交叉编译器兼容的库,我可能错过了其他一些东西
如有任何建议或意见,将不胜感激 我认为微软编译器需要declspec(dllexport) 以下是msdn链接:
为什么不发布准确的错误消息,让每个人都能准确地看到MinGW要找的名字?发布
dumpbin/symbols LibTest.lib的输出也可能有帮助,这样我们可以看到MSVC创建的库中有哪些名称。MinGW的确切错误是:obj\Release\main.o:main.cpp(.text+0x16):测试的未定义引用dumpbin/symbols
的输出只是“文件类型:库”。有趣的是,reimp
在LibTest.lib上运行时也不会生成任何输出。看起来VS 2012生成的库在某种程度上是无效的。当尝试从另一个VS 2012项目链接到库(删除extern“C”
块以防引起问题)时,生成失败,出现错误LNK2001:未解析的外部符号“int\u cdecl Test(int)”(?Test@@YAHH@Z)
我不确定该库可能出了什么问题;我创建它的过程与上述详细过程相匹配。如果从命令行构建库,会发生什么情况:cl/c libtest.cpp&&lib libtest.obj
从命令行构建库可以正常工作,也可以专门用于创建与MinGW一起工作的库。显然,我的VS 2012项目设置有问题。MinGW在链接库时生成警告:警告:.drectve/DEFAULTLIB:“LIBCMT”/DEFAULTLIB:“OLDNAMES”无法识别
,但生成的程序可以工作。谢谢你的帮助,@MichaelBurr!
// LibTest.cpp
#include "LibTest.h"
extern "C" {
int Test(int input){
return (input + 5);
}
}
// 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;
}