2013-02-15 145 views
15

我在使用GCC/Linux構建共享庫時遇到了問題。目前這個共享庫是用GCC/libtool選項「共享」創建的,一切都很好。在構建期間將靜態庫鏈接到共享庫?

現在有兩個額外的靜態庫(.a文件)必須被添加到這個共享庫中,因爲它們提供了共享所需的一些功能。使用選項「-l」添加這些靜態庫不會有幫助,之後它們不會是.so文件的一部分。

那麼我該如何強制GCC/libtool真正將這些靜態庫的代碼添加到共享庫中?

謝謝!

+0

爲了創建可執行文件,你可以只添加靜態庫的完整路徑GCC的建設方案,例如:'gcc -Wall -g live_mystuff.c -o my_app /usr/local/src/ffmpeg/libswscale/libswscale.a -lpthread -lbz2 -lm -lz -lfaac -lmp3lame -lx264 -lfaad ...'It也可能用於創建共享庫。嘗試一下。 – fritzone 2013-02-15 07:26:16

+0

你怎麼知道他們「不是.so文件的一部分」? – 2013-02-15 07:26:38

+0

@fritzone:對於工作沒有問題的可執行文件,我必須爲共享庫做 – Elmi 2013-02-15 07:48:41

回答

21

在這種情況下,您需要使用--whole-archive鏈接器選項來命令鏈接器將整個靜態庫的內容包含到共享庫中。

g++ -shared sample.o -o libSample.so -Wl,-whole-archive -lmylib1.a -lmylib2.a -Wl,-no-whole-archive 

man ld

對於--whole歸檔選項後,在命令行中提到的每個歸檔,包括鏈接在歸檔中每個對象文件,而不是搜索歸檔所需的對象文件。這通常用於將存檔文件轉換爲共享庫,從而強制每個對象都包含在生成的共享庫中。該選項可能會多次使用。

從gcc使用這個選項時有兩點需要注意:首先,gcc不知道這個選項,所以你必須使用-Wl,-whole-archive。其次,不要忘記在歸檔列表後面使用-Wl,-no-whole-archive,因爲gcc會將自己的歸檔列表添加到鏈接中,並且您可能不希望此標誌影響這些歸檔。

+0

我不得不在'-WL,'之後使用bot破折號。 – stefanct 2016-03-12 21:15:13

2

你只需要--whole歸檔參數鏈接,包括圖書館,但它應該能夠從無與倫比的標誌推斷其自身的需求。

確保在命令行中的任何靜態庫來他們的依賴對象的文件後,如:

g++ -Wl,-E -g -pipe -O2 -pipe -fPIC myobjectfile.o mystaticlibrary.a -shared -o mylib.so