2011-09-22 230 views
5

我與SFML工作的依存關係,我整理了一個小的測試程序,並添加了鏈接選項-lsfml-audio。然後,我使用ldd ./program來查看它鏈接到的動態庫。令人驚訝的是,有很多,我沒有手動選擇我的生成文件,也沒有使用pkg-config --libs鏈接共享庫

我開始閱讀關於共享庫,並提出了一個小例子來解決我的疑惑。不過,我有這樣一個問題:

爲什麼一些圖書館需要您添加的依賴在你的makefile (手動或使用像pkg-config腳本)和其他 庫自動鏈接它們的依賴?

當您建立動態庫,只是作爲g++ -shared ...命令添加適當的-ldependency選項,以避免用戶手動添加的依賴以後的麻煩一樣容易。爲什麼很多可用的庫不這樣做?

我猜它必須與微調的哪些庫獲取鏈接和這樣的能力。

回答

6

共享庫通常會鏈接在他們的依賴。但是,靜態庫不能這樣做。 pkg-config --libs通常包含所有依賴關係(直接和間接),以便您可以通過簡單添加-static來切換到靜態編譯,而無需添加其他庫依賴關係。

注意的是,這些過剩的直接依賴被認爲在某些情況下不需要的(例如,Debian的嘗試,以避免他們在包裝的二進制文件,因爲他們使庫的soname轉變超過必要的創傷)。您可以指示鏈接器從最終可執行文件中去除-Wl,--as-needed標誌不需要的直接依賴項。

+0

我想我需要做一些罵人的位置:共享庫通常不會在它們的依賴拉(這是'libtool'當它看到一個'* .la'文件)。它們不需要包含它,因爲動態加載器會從共享庫中的'.NEEDED'頭中找出它們。除了libtool介紹的鏈接問題之外,不得不在鏈接時查找符號定義也會減慢構建的速度。 –

+0

@ honk,是的,libtool是這些問題的一個來源。不過,pkg-config腳本也可以。無論如何,它們在ELF平臺上絕對不是必需的 - 您只需直接鏈接您使用的內容(儘管這包括通過內聯函數或宏使用的任何內容) – bdonlan