2012-01-23 75 views
4

我有靜態C++庫,編譯MSVC和DLL文件(庫稱爲opennurbs)。我需要在項目中使用這個庫,由mingw編譯(我使用Qt創建器,但項目不使用qt庫)。所以,我有沒有解決的外部。我認爲與名稱混爲一談的問題。 如何將.lib文件轉換爲.a庫? 我嘗試使用nm命令,但它不起作用:「foo.dll中沒有符號」。 外部「C」不起作用,因爲它是C++庫。在mingw中使用MSVC++ .lib文件。名稱損壞

+0

你說你有一個靜態庫和一個DLL。那是對的嗎?這意味着你有兩個.lib文件。一個用於包含大量代碼的靜態庫,另一個用於只有導入存根的DLL。 –

+1

看起來,你可以注意到(像我一樣,哦!),因爲'cl'和'mingw'的'ABI'不同。抱歉。 – Lol4t0

+0

Microsoft編譯器生成的二進制文件與MinGW/GCC不兼容。在成功鏈接之前,您需要重新編譯庫。 –

回答

3

一般而言,您將無法使用由另一個程序構建的程序使用一個編譯器構建的C++ DLL。名稱修改只是其中一個問題 - 對於異常處理,RTTI,內存管理甚至類佈局本身(特別是對於多重和虛擬繼承)沒有兼容性保證,僅舉幾個潛在問題。

的幾點建議(他們都不理想):

  • 最好的解決辦法是,如果你可以完全避開原來的問題,或者獲取你的編譯器的二進制文件或從源代碼建立(即建立DLL和其客戶端來自MinGW)。
  • 如果您可以將DLL的接口公開爲純C API,請執行此操作。例如。 Win32是「C API」,適用於各種編譯器,而不僅僅是C/C++。
  • 如果你想爲你的DLL使用「面向對象」的API,不需要可移植性,並且準備投入必要的開發工作,提供一個COM API值得一看。
2

確切地理解你的問題很難,但一個解決方案是顯而易見的。 openNURBS代碼免費提供完全許可許可證。你應該只是download它並直接在mingw中編譯它。

在任何情況下,這將是唯一可行的路線。 C++沒有標準的二進制接口,每個工具都有不同的二進制接口。這甚至可以在相同工具的不同版本之間有所不同。更重要的是,MSVC編譯的庫將依賴於mingw編譯代碼中的不同C++運行時庫。

所以,底線是你需要由你的mingw編譯器編譯的openNURBS。但幸好這是可能的,因爲圖書館是作爲來源分發的。

+0

最新版本不能幫助我。但是我的openNURBS版本不能和mingw一起編譯。不管怎樣,謝謝!我希望我能找到解決方案。 – flamingo