2017-07-16 33 views
1

我正在寫一個基於libpthread.so的共享庫。要構建它,我用下面的命令:如何在linux中創建共享庫時包含依賴信息?

gcc -fPIC -shared -lpthread -o libfoo.so foo.c 

但連接使用libfoo.so文件時,我必須指定選項-lpthread -lfoo不僅僅是-lfoo。另外,ldd libfoo.so不顯示關於libpthread.so的任何信息。

那麼,有沒有什麼辦法可以避免'-lpthread'?

+4

你的命令行順序錯誤,你需要把你想鏈接的庫放到最後*:'gcc -fPIC -shared -o libfoo.so foo.c -lpthread' –

+0

它的工作原理!非常感謝! – olist

回答

0

擴展@Someprogrammerdude的評論:

您的命令行是在錯誤的順序,你需要把 你想最後一個鏈接庫:gcc -fPIC -shared -o libfoo.so foo.c -lpthread

我要說,這樣做是件壞事。連接其他共享庫的共享庫並不好,因爲:

  • 最終使用它們的程序也可能使用您的libpthread,但它可能需要不同的版本。由於鏈接器符號是全局的(在進程內部),鏈接同一個庫的多個版本可能會導致最糟糕的,最糟糕的二進制可調試錯誤。考慮它是僞隨機的,將使用給定全局變量/ api調用的哪個版本。
  • 但是,使用與編譯它相同的庫的不同版本不是問題。原因是這些庫可以相互兼容,並且可以通過相對較新的glibc特性(它使用特殊的鏈接符號來決定兼容性)很容易地決定它們。

特別是在glibc的(其部分的libpthread)是二進制兼容性非常重要的,所以它並不真正的問題,與你的libpthread編譯的二進制文件,它會無處不在的foreseeble今後的工作。而且,如果不是,它會導致鏈接器錯誤,而不是神祕的錯誤。

因此,最佳的解決方案是:

  1. 完全從共享庫的鏈接放出來的libpthread(你不需要它來編譯,你只需要其上運行它的符號)
  2. 是的,如果您使用libfoo編譯二進制文件,則必須同時提供-lfoo-lpthread

(2)是不是一個很大的問題 - 有哪些可以自動生成所需的編譯器/連接器選項的庫各種工具(如GNU autoconf的)。