2012-02-19 784 views
4

我有一箇舊庫(C++),我只能在Windows上的MinGW + MSYS32上構建。從中我可以生成一個.a從GNU libtool生成的靜態庫文件。我的主要開發是在Visual Studio 2008中完成的。如果我嘗試使用MinGW生成的庫並在Visual Studio中將其鏈接起來,它會抱怨缺少外部。這很可能是由於完成了C++符號修改,並且它與.a文件中的內容不匹配。有沒有什麼知道的方法將靜態.a文件轉換爲VC++庫格式?從MinGW .a轉換爲VC++ .lib

+0

不,你不能這樣做。您需要在要用來鏈接它的編譯器中重新編譯二進制文件。 – 2012-02-19 03:15:23

回答

3

如果符號發生了不同的編譯,編譯器使用的是不同的ABI,那麼您將無法「轉換」或編譯的任何庫:原因名稱以不同方式被破壞的原因是有意避免用戶成功使用不同的ABI構建來自對象文件的可執行文件。 ABI定義了參數是如何傳遞的,虛函數表是如何表示的,如何拋出異常,基本數據類型的大小以及其他許多事情。這個名字也是其中的一部分,並且經過精心挑選,與同一平臺上的其他ABI高效並有所不同。最簡單的方法來查看名稱是否確實不同,它是使用兩種編譯器僅使用基本類型編譯文件,然後查看符號(在UNIX上,我將使用nm;我不是一個Windows程序員,因此我不知道在那裏使用什麼工具)。

基於Wikipedia似乎也MinGW的使用不同的運行時庫:佈局和MinGW的(libstdc++)中使用的C++標準庫和Visual Studio(Dinkumware)的實施不兼容。即使兩個編譯器之間的ABI是相同的,但使用的標準C++庫不是。如果ABI是相同的,則需要將設置替換,以便一個編譯器使用相應其他編譯器的標準庫。沒有辦法用已編譯的庫來做到這一點。我不知道這是否可行。

就我個人而言,我不會費心嘗試鏈接這兩個不同的編譯器之間的東西,因爲它根本不工作。相反,您需要將實現移植到通用編譯器並從那裏開始。

+0

請注意,一般來說,C代碼可用於不同的編譯器。 MinGW GCC可以鏈接到VC .lib文件,但反過來是不可能的。 – rubenvb 2012-02-19 11:03:31

2

搜索def文件並運行命令,例如lib/machine:i386 /def:test.def它會生成一個導入lib文件的 。