我有一箇舊庫(C++),我只能在Windows上的MinGW + MSYS32上構建。從中我可以生成一個.a從GNU libtool生成的靜態庫文件。我的主要開發是在Visual Studio 2008中完成的。如果我嘗試使用MinGW生成的庫並在Visual Studio中將其鏈接起來,它會抱怨缺少外部。這很可能是由於完成了C++符號修改,並且它與.a文件中的內容不匹配。有沒有什麼知道的方法將靜態.a文件轉換爲VC++庫格式?從MinGW .a轉換爲VC++ .lib
回答
如果符號發生了不同的編譯,編譯器使用的是不同的ABI,那麼您將無法「轉換」或編譯的任何庫:原因名稱以不同方式被破壞的原因是有意避免用戶成功使用不同的ABI構建來自對象文件的可執行文件。 ABI定義了參數是如何傳遞的,虛函數表是如何表示的,如何拋出異常,基本數據類型的大小以及其他許多事情。這個名字也是其中的一部分,並且經過精心挑選,與同一平臺上的其他ABI高效並有所不同。最簡單的方法來查看名稱是否確實不同,它是使用兩種編譯器僅使用基本類型編譯文件,然後查看符號(在UNIX上,我將使用nm
;我不是一個Windows程序員,因此我不知道在那裏使用什麼工具)。
基於Wikipedia似乎也MinGW的使用不同的運行時庫:佈局和MinGW的(libstdc++)中使用的C++標準庫和Visual Studio(Dinkumware)的實施不兼容。即使兩個編譯器之間的ABI是相同的,但使用的標準C++庫不是。如果ABI是相同的,則需要將設置替換,以便一個編譯器使用相應其他編譯器的標準庫。沒有辦法用已編譯的庫來做到這一點。我不知道這是否可行。
就我個人而言,我不會費心嘗試鏈接這兩個不同的編譯器之間的東西,因爲它根本不工作。相反,您需要將實現移植到通用編譯器並從那裏開始。
請注意,一般來說,C代碼可用於不同的編譯器。 MinGW GCC可以鏈接到VC .lib文件,但反過來是不可能的。 – rubenvb 2012-02-19 11:03:31
搜索def文件並運行命令,例如lib/machine:i386 /def:test.def它會生成一個導入lib文件的 。
- 1. 如何將VSTS .lib轉換爲MinGW .a?
- 2. 從IO Maybe a轉換爲EitherT IO a
- 3. A轉換的VC++ 2003項目詢問msvcpd71d.dll在VC++ 2008
- 4. 從MinGW靜態庫(.a)到Visual Studio靜態庫(.lib)
- 5. 轉換被VC++ 6.0 VC++ 2005
- 6. 將項目從vc 6.0轉換爲vc 2010時出現錯誤
- 7. VC++的轉換
- 8. VC++ libcurl .lib大小
- 9. 從VC A推UIViewController B,但是釋放VC A一旦VC B可見
- 10. 轉換成Windows庫的MinGW庫在VC++中給出奇數鏈接6
- 11. 使用VIM從A轉換爲B
- 12. 「無法從‘A’轉換爲‘B&’
- 13. 在mingw中使用msvc lib
- 14. 轉換A○至A A○
- 15. 參考VC++代碼或轉換爲DLL?
- 16. VC++ 9 QT項目,轉換爲Eclipse CDT
- 17. 如何將VC++代碼轉換爲C#?
- 18. vC++ - 如何將CString轉換爲LPCWSTR
- 19. 無法將參數從常量A轉換爲A
- 20. VC++到VB.NET代碼轉換
- 21. UCHAR *到CString轉換和CString到UCHAR *轉換爲vC++
- 22. 從vc6切換到mingw
- 23. 將lib +頭文件轉換爲DLL
- 24. 將.lib和.h文件轉換爲.NET
- 25. 如何將struct packing從vC++轉換爲gcc
- 26. 從const char *轉換爲char *修改VC++中的數據
- 27. 爲什麼'a'轉換爲&nbsp
- 28. Matlab將字符串「aaa」轉換爲[「a」,「a」,「a」]數組
- 29. 將.a文件轉換爲.dll
- 30. 轉換/翻譯tbl lib idl
不,你不能這樣做。您需要在要用來鏈接它的編譯器中重新編譯二進制文件。 – 2012-02-19 03:15:23