2008-08-16 35 views
33

我厭倦了將10個鏈接庫添加到我的項目中,或者需要其中8個使用我自己的鏈接庫。我想使用libpng.a,libz.a,libjpeg.a等現有庫,並將它們合併成一個.a庫。那可能嗎?如何結合.lib庫?如何將幾個C/C++庫合併爲一個?

回答

8

在Unix等系統上,ld和ar實用程序可以執行此操作。查看http://en.wikipedia.org/wiki/Ar_(Unix)或查看任何Linux機器或通過谷歌的手冊頁,例如'unix man ar'。

請注意,鏈接到共享(動態)庫可能會更好。這會爲您的可執行文件添加依賴項,但會大大減小其大小,特別是在編寫圖形應用程序時。

+0

爲什麼圖形應用程序中的圖像尺寸越小越好? – bigD 2013-12-29 19:15:23

+1

較小的圖像尺寸通常更好。圖形庫(xlib等)往往非常大,所以如果靜態鏈接,可以製作非常大的可執行文件。 – Avner 2013-12-30 06:28:30

+0

哦,所以你的意思是GUI應用程序。我以爲你指的是3D引擎中的圖形與GPU着色器和東西... – bigD 2014-01-01 10:43:25

0

我不知道如何將它們物理地結合成一個文件,但是您可以使用一種排序的抽象,並且只包含一個「AllMyLibs.a/h」,然後包含您想要的所有內容。你也可以把它放到你的編譯器搜索庫的位置,所以它可以用於任何項目。

P.S. - 出於好奇,你爲什麼不喜歡包含單個庫?

23

您可以用

ar x <library name> 

提取每個庫的目標文件,然後將它們全部用

ar cs <new library name> <list each extracted object file> 
0

也許我誤解,但只有你不合併成一個新的圖書館如果最終用戶代碼直接調用它們,必須運送庫文件?如果所有對Jpeg方法等的訪問都來自您的靜態庫中的代碼,那麼只需將這些庫鏈接到您的lib中。

I.e.

---------------- 
| End-user exe | 
---------------- 
     | 
     | makes calls to 
     | 
     v 
-------------------- 
| Your static lib.a | 
-------------------- 
     | makes calls to and links 
     v 
    ------------------------------------ ..... 
    |     |   | 
    ------------- -------- ---------- 
    | libjpeg.a | |libz.a| |libpng.a| 
    ------------- -------- ---------- 

也就是說,它只是一個問題,如果最終的代碼需要直接調用到libz.a,libpng.a等

如果應用程序代碼具有合法的需要調用libz.a,例如,那麼就像上面提到的那樣使用動態模塊。

PS:我有藝術家徽章嗎? :)

-1

將幾個第三方庫合併爲一個可能會給您帶來更多問題 - 例如,如果其中兩個庫定義了您的程序不使用的通用符號。現在,在組合這些庫之前,您必須提取公用符號的所有實例(或全部爲一個)。

3

在Linux或MinGW的或Cygwin的,與GNU工具鏈:

ar -M <<EOM 
    CREATE libab.a 
    ADDLIB liba.a 
    ADDLIB libb.a 
    SAVE 
    END 
EOM 
ranlib libab.a 

或者,如果你能保持的liba.alibb.a存在:

ar crsT libab.a liba.a libb.a 

在Windows上,與MSVC工具鏈:

lib.exe /OUT:libab.lib liba.lib libb.lib