2013-04-24 78 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

回答