1. 程式人生 > >mingw&vc靜態庫lib

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呼叫了他自己的庫函式。所以我們回發現,通用靜態庫失敗時顯示的都是庫函式沒定義之類的錯誤。其實是函式名的符號不能識別。如果知道所需的庫函式的具體檔案,並加入到專案的編譯中,相信很可能就會解決問題。不論如何,目前靜態庫的通用方法還有待進一步的探討。

"