5

我有一個項目,我有一個靜態庫libhelper.a和另一個與我的實際共享對象庫libtestlib.so。我的目標是將libhelper.a鏈接到libtestlib.so。這在Linux/BSD上可能嗎?當我試圖創造一個測試程序,我得到了以下錯誤:混合靜態庫和共享庫

./prog1:/usr/local/lib/libtestlib.so.1.0:未定義的符號'

我的猜測是這是因爲libhelper.a未編譯爲-fPIClibtestlib.so是。構建使用共享庫的程序的正確方法是什麼?這些庫也具有靜態庫的依賴關係?

謝謝!

+0

「將libhelper.a鏈接到libtestlib.so」什麼? – 2011-03-26 17:14:02

+0

到目前爲止您嘗試了什麼?無論如何,我不知道有什麼方法將非PIC代碼鏈接到共享庫中。靜態庫通常只能鏈接到可執行文件中,這就是爲什麼它們很少用PIC編譯的原因。你不能將兩個庫鏈接到可執行文件,或者從一開始就用PIC來構建? – Philipp 2011-03-26 18:24:53

回答

11

我的目標是將libhelper.a鏈接到libtestlib.so。這在Linux上可能嗎?

當然。這應該這樣做:

gcc -shared -fPIC -o libtestlib.so $(OBJS) \ 
    -Wl,--whole-archive -lhelper -Wl,--no-whole-archive 

libhelper.a不是用-fPIC

編譯這是最好的重建libhelper.a與-fPIC。如果這是不可能的,上述命令仍然可以在Linux/ix86上運行,但不會在例如Linux/x86_64

構建使用共享庫的程序的正確方法是什麼?這些共享庫也具有靜態庫的依賴關係?

如果包括libhelper.alibtestlib.so如上,那麼簡單:

gcc main.c -ltestlib 

是你所需要的。如果您堅持與libhelper.a聯繫,那麼您必須告訴最終用戶他必須與例如

gcc main.c -ltestlib -lhelper 

沒有辦法指定libtestlib.so取決於libhelper.a

+0

謝謝,我可以用-fPIC重建libhelper.a,所以我會繼續這樣做。 – 2011-03-28 16:35:09