mingw&vc靜態庫lib

網上大多說的是 dll 怎麼生成 .lib 什麼的,這裏是將mingw生成的.a文件拉出符號表文件.lib。

先用 ar 將 .a 中的所有 .o 文件解出來:

ar x libatlas.a  


使用 MinGW 的 --export-all-symbols 選項,鏈接成 dll ,並導出所有符號:

gcc -shared -o atlas.dll *.o -Wl,--export-all-symbols,--output-def,atlas.def  


使用 VC++ 自帶的 lib 命令製作 .lib(需要上一步的 .def 文件):

lib /machine:i386 /def:atlas.def


另外如何將mingw生成的靜態庫.a轉換成msvc能用的靜態庫而非僅僅是提供索引功能的.lib文件呢?

看到大神的帖子http://blog.csdn.net/weekly123/article/details/5640656:

"至於靜態庫.lib和.a之間的轉換。據說這是同一種類型的歸檔文件,不同的只是歸檔裏包含的內容。lib裏包含的是.obj文件,a裏包含的是.o文件。然而,這兩種文件的格式據說也是相同的,然而我們發現lib和a無法通用!(請注意,這裏的靜態庫lib不是調用dll時的那種靜態庫lib。那種lib只是起到索引和連接dll的功能,而這裏所說的靜態庫是脫離dll工作的庫,函數過程都包含在庫裏了)。以前我曾經寫過一篇文章,討論過cygwin上的庫和mingw通用的方法。其實現在我們可以更清晰的明白,他們之所以通用是因爲兩者都是用gcc編譯的。同一種編譯器出來的結果當然可以兼容。那篇文章的價值在於。cygwin雖然工具包很多,但是要獨立運行還需要dll支持。而mingw則可以生成不依賴於dll獨立運行的程序。

那麼lib和a不能通用的原因到底在哪裏呢?起初覺得有可能在編譯器上。因爲vc的編譯器cl和gcc的編譯器編譯出來的obj和o文件雖然格式相同卻不能通用。實驗表明,拿o文件給cl用,或拿obj給gcc用都通不過。然而,我對這點還不表示懷疑!因爲我覺得最可能的原因並不在這裏。行不通的原因很可能是兩個編譯器調用了不同的庫函數。cl調用了MSVC提供的庫函數,而gcc調用了他自己的庫函數。所以我們回發現,通用靜態庫失敗時顯示的都是庫函數沒定義之類的錯誤。其實是函數名的符號不能識別。如果知道所需的庫函數的具體文件,並加入到項目的編譯中,相信很可能就會解決問題。不論如何,目前靜態庫的通用方法還有待進一步的探討。

"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章