我想構建一個共享庫。讓我們說libabc.so。它使用另一個.so文件,比如說lib123.so(在/ usr/local/lib中的一個lib)。現在我在我的應用程序中使用我的共享庫libabc.so。說我的應用程序。我想知道我應該如何鏈接這些二進制文件??我不想直接鏈接我的應用程序與lib123.so。我的應用程序應該只與libabc.so鏈接。我怎樣才能做到這一點?鏈接共享庫與Linux中的另一個共享庫
在此先感謝。我正在使用g ++編譯器
我想構建一個共享庫。讓我們說libabc.so。它使用另一個.so文件,比如說lib123.so(在/ usr/local/lib中的一個lib)。現在我在我的應用程序中使用我的共享庫libabc.so。說我的應用程序。我想知道我應該如何鏈接這些二進制文件??我不想直接鏈接我的應用程序與lib123.so。我的應用程序應該只與libabc.so鏈接。我怎樣才能做到這一點?鏈接共享庫與Linux中的另一個共享庫
在此先感謝。我正在使用g ++編譯器
假設libabc.so
從posiition independent獲得目標代碼文件abc1.pic.o
和abc2.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
共享庫。
正如你看到的,你可以鏈接共享庫lib123.so
到自己的共享庫libabc.so
然後用ldd libabc.so
PS檢查。不要使用靜態庫lib123.a
(它應該是PIC)。如果將非PIC代碼鏈接到共享對象中,則會喪失共享對象的大部分優點,並且動態鏈接程序ld.so必須執行無數次重定位。
我已經完成了你在這裏提到的完全一樣的東西。但是當我在libabc.so上執行ldd時,它並沒有列出lib123.so。你知道這是爲什麼嗎? –
爲什麼不用lib123的靜態庫?如果它不是PIC? –
我忍不住了,除非你**至少展示了**精確的命令**,涉及構建你的'abc * .pic.o'對象和'libabc.so'庫。 –
當試圖創建我自己的使用Berkeley DB的共享庫時,我發現我必須將-ldb放在gcc命令的末尾,否則它會爆發說未找到符號'db_create'。這是在Cygwin之下。
具體來說,這個工作:
的gcc -o -shared $ B/$ LIBFILE NT _ *Ø-ldb
這不起作用:
GCC - ldb -shared -o $ b/$ libfile nt _ *。
你有沒有想過使用一個atuomated構建系統,fo例如autotools? autotools自帶libtool,它將構建共享庫所需的大部分尷尬處理都帶走了。 –
@nyarlathotep:你建議與靜態鏈接'lib122.a'共享'libabc.so' –
顯示確切的構建命令(對於目標文件和共享庫)是錯誤的。 –