2012-12-21 106 views
1

我正在linux上生成一個共享庫,我正在使用這個xml解析器「mini xml」來解析我的庫的一些xml配置文件。我想要的是不要依賴這個XML解析器,所以我想使用供應商提供的靜態libmxml.a庫,而不是使用libmxml.so,libmxml.so也與libmxml.so一起使用,這樣我的共享庫部署時不依賴於libmxml。我試過以下,但它不起作用。使用靜態庫編譯PIC對象

的gcc -o -fPIC -static myobject.o -c -lmxml myobject.c

但它在警告

鏈接輸入未使用的,因爲鏈接尚未完成

我錯過了什麼?任何幫助,將不勝感激。

回答

1

你需要建立MXML庫專門爲此創建了一個帶有PIC代碼的靜態庫(-fPIC),比如libmxml_pic.alibmxml.a包含位置相關的代碼,它只適用於可執行文件(在32位x86上它可以工作,但它仍然很難看)。

您還需要避免從庫中導出mxml符號。您可以使用版本腳本(--version-script至ld,請參閱文檔)和/或在編譯mxml對象時傳遞-fvisibility=hidden來完成此操作。

+0

Thanks @jilles!我正在做你說的。我研究了其源碼附帶的mini xml的makefile。我發現庫已經被編譯了-fPIC標誌。所以當我用libmxml.a(用-fPIC編譯)編譯我的庫時,當我嘗試使用我的庫運行任何應用程序時,它會得到一些未定義的mxml符號。現在當我複製所有的。o mxml文件到我的目錄的源文件夾並編譯我的庫,包括mxml對象以及我的庫對象,我可以運行一個使用我的庫構建的應用程序,具體取決於libmxml。 –

3

您收到警告,因爲-c表示只能編譯。 鏈接器永遠不會運行,因此-lmxml是鏈接器命令,不起作用。

-static將使整個可執行文件是靜態的,這也意味着靜態libc。 這可能不是你想要的。 要僅在libmxml.a靜態鏈接使用:

gcc -fPIC myobject.o -o executable /usr/lib/libmxml.a 

gcc -fPIC myobject.o -o executable -Wl,-Bstatic -lmxml -Wl,-Bdynamic 

創建一個共享庫,而不是可執行添加-shared

+0

但它不會讓myobject.o成爲可執行文件?我先編譯目標文件,然後將它們合併到共享庫中。 –

+0

@JewelThief:是的,鏈接外部庫是在最後一個「組合」步驟中完成的,稱爲鏈接。是的,圖書館也是有聯繫的。 – datenwolf

+0

@JewelThief:也要注意jilles的回答:這個靜態構建很可能既不是PIC也不符合你的目標架構。最好的辦法是自己重建該庫,確保靜態構建是PIC(是的,靜態庫也可以是PIC),並且與目標拱相匹配。 – datenwolf