2013-04-24 79 views
3

我想创建一个静态库使用MS Visual Studio 2012,MinGW将能够链接到(我正在处理MinGW这一过程与Code :: Blocks )。创建一个MSVC库,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

为什么不公布确切的错误信息,这样每个人都可以看到究竟是什么名字的MinGW想要?发布'dumpbin/symbols LibTest.lib'的输出可能也很有意义,因此我们可以看到MSVC创建的库中的名称。 – 2013-04-24 19:03:02

+0

MinGW的确切错误是:'obj \ Release \ main.o:main.cpp(.text + 0x16):对Test'的未定义引用''dumpbin/symbols'的输出只是“File Type:LIBRARY”。有趣的是,'reimp'在LibTest.lib上运行时也不会产生任何输出。 – 2013-04-24 19:33:02

+0

看来,VS 2012正在生产的库在某些方面无效。当尝试从另一个VS 2012项目链接到库(extern“C”块被去除,以防万一它们导致问题时),构建失败,并且出现“错误LNK2001:未解析的外部符号”int __cdecl Test int)“(?Test @@ YAHH @ Z)'我不确定图书馆会出现什么问题,我的程序创建它匹配详细[这里](http://msdn.microsoft.com/en-ca/library/ms235627%28v=vs.110%29.aspx)。 – 2013-04-24 20:15:08

回答