2013-10-17 71 views
15

我想構建一個共享庫。讓我們說libabc.so。它使用另一個.so文件,比如說lib123.so(在/ usr/local/lib中的一個lib)。現在我在我的應用程序中使用我的共享庫libabc.so。說我的應用程序。我想知道我應該如何鏈接這些二進制文件??我不想直接鏈接我的應用程序與lib123.so。我的應用程序應該只與libabc.so鏈接。我怎樣才能做到這一點?鏈接共享庫與Linux中的另一個共享庫

在此先感謝。我正在使用g ++編譯器

+0

你有沒有想過使用一個atuomated構建系統,fo例如autotools? autotools自帶libtool,它將構建共享庫所需的大部分尷尬處理都帶走了。 –

+0

@nyarlathotep:你建議與靜態鏈接'lib122.a'共享'libabc.so' –

+0

顯示確切的構建命令(對於目標文件和共享庫)是錯誤的。 –

回答

16

假設libabc.soposiition independent獲得目標代碼文件abc1.pic.oabc2.pic.o;那麼你已經用例如

gcc -Wall -fPIC -O -g abc1.c -c -o abc1.pic.o 
gcc -Wall -fPIC -O -g abc2.c -c -o abc2.pic.o 

與您共建libabc.so

gcc -shared abc1.pic.o abc2.pic.o -L/usr/local/lib -l123 -o libabc.so 

我加-L/usr/local/lib-l123因爲我假設你有一個/usr/local/lib/lib123.so共享庫。

又讀Program Library HowTo

正如你看到的,你可以鏈接共享庫lib123.so到自己的共享庫libabc.so

然後用ldd libabc.so

PS檢查。不要使用靜態庫lib123.a(它應該是PIC)。如果將非PIC代碼鏈接到共享對象中,則會喪失共享對象的大部分優點,並且動態鏈接程序ld.so必須執行無數次重定位。

+1

我已經完成了你在這裏提到的完全一樣的東西。但是當我在libabc.so上執行ldd時,它並沒有列出lib123.so。你知道這是爲什麼嗎? –

+0

爲什麼不用lib123的靜態庫?如果它不是PIC? –

+1

我忍不住了,除非你**至少展示了**精確的命令**,涉及構建你的'abc * .pic.o'對象和'libabc.so'庫。 –

1

當試圖創建我自己的使用Berkeley DB的共享庫時,我發現我必須將-ldb放在gcc命令的末尾,否則它會爆發說未找到符號'db_create'。這是在Cygwin之下。

具體來說,這個工作:

的gcc -o -shared $ B/$ LIBFILE NT _ *Ø-ldb

這不起作用:

GCC - ldb -shared -o $ b/$ libfile nt _ *。