2010-05-18 232 views
3

我struggeling一些選項一點點在一個項目上聯,我目前的工作:鏈接一個共享庫靜態到我的共享庫

我想創建這是對2其他需要連接的共享庫庫。 (讓我們叫他們libfoo.solibbar.so
我的輸出庫必須是共享庫,我想靜態鏈接libfoo.so到結果庫,但libbar.so應鏈接爲一個動態庫。 (libbar.so應在每臺機器上都可用,其中libfoo.so不可用,我不希望用戶安裝它/將其與我的二進制文件一起發送。)

我該如何歸檔?

我當前的構建指令是這樣的:

c++ -Wall -shared -c -o src/lib.o src/lib.cpp 
c++ -Wall -shared -o lib.ndll src/lib.o -lfoo -lbar 

我自己辯護:我不是一個C/C++高手,很抱歉,如果這個問題似乎是愚蠢的。

+1

在我看來,這是http://stackoverflow.com/questions/2812079/compile-a-的副本shared-library-statically/2812137 – AProgrammer 2010-05-18 16:21:59

+0

我沒有靜態版本的libfoo.so – TheHippo 2010-05-18 16:26:43

+0

據我所知,那是不可能的。您可以再次檢查鏈接器手冊。 – AProgrammer 2010-05-18 16:31:30

回答

10

有兩種Linux C/C++庫類型。

  • 靜態庫(*.a)是其與連接併成爲本申請的一部分對象代碼檔案。它們使用ar(1)命令創建並可以使用該命令進行操作(即ar -t libfoo.a將列出庫/檔案中的文件)。

  • 動態鏈接的共享對象庫(*.so)可以以兩種方式使用。

    1. 共享對象庫可以在運行時動態鏈接,但靜態感知。這些庫在編譯/鏈接階段必須可用。共享對象不包含在二進制可執行文件中,但與執行有關。
    2. 共享對象庫可以在執行期間使用動態鏈接加載器系統函數動態加載/卸載和鏈接。

爲了靜態鏈接libfoo.so到您的二進制文件,你需要,通常稱爲libfoo.a相應的靜態庫。在創建程序可執行文件時,可以通過調用它作爲編譯和鏈接過程的一部分來使用靜態庫。

會改變你的構建結果命令像下面這樣:

g++ -Wall -fPIC -c -o src/lib.o src/lib.cpp 
g++ -shared -Wl,-soname,mylib.so.1 -o mylib.so.1 src/lib.o -L/path/to/library-directory -lbar libfoo.a