2010-08-05 31 views
5

首先,我不知道我的問題是否有解決方案。如何可選地依賴於gcc的共享對象?

我有以下情況:

  • 我已經開發了依賴於其他幾個庫爲特定的硬件訪問的框架庫等
  • 直到現在這個框架庫是隻針對靜態鏈接。
  • 對於使用框架庫的可執行文件,只能鏈接可執行文件實際使用的代碼的依賴關係。 (如果我根本不訪問特定的硬件,我不必依賴於它的關聯庫)。

現在我還需要製作一個框架庫的共享對象。此外,依賴關係可以作爲共享庫來使用,因此不需要任何靜態鏈接。

這個問題我現在有:

  • 當建立動態鏈接的框架庫我必須要麼鏈接所有依賴動態的框架庫或應用程序的應用程序。 (否則,我從LD未定義的引用投訴)

我的問題:

  • 有沒有辦法忽略某些共享庫的依賴,如果我知道,我的申請將不使用框架的任何代碼依賴這個共享對象的庫?

  • 有沒有辦法做到這一點沒有或只有最少的代碼更改? (鏈接器/編譯器開關)

我還需要在原始情況下描述的靜態鏈接仍然工作。

附加信息:

  • 操作系統:Linux(Debian的萊尼)
  • 編譯器:GCC-4.3

回答

6

man ld

--as急需
--no-按需

此選項會影響之後的命令行上提到的動態庫ELF DT_NEEDED標籤 - 需要的選項。通常, 鏈接器將爲命令行上提到的每個動態庫添加DT_NEEDED標記,而不管該庫是否實際需要 。 --as-needed會導致DT_NEEDED標記僅針對滿足來自常規 對象的符號引用的庫發出,而該對象在鏈接該庫時未定義,或者如果未在DT_NEEDED列表中找到庫其他 庫鏈接到該點,從另一個動態庫的引用。 - 不需要按需恢復默認行爲。

我沒有使用它自己,但聽起來像你在找什麼。

g++ -o your_app -Wl,--as-needed -lframework -la -lb -lc -Wl,--no-as-needed 

編輯(由漢諾建議)

--warn懸而未決符號

如果連接器會報告一個未解決的符號(見選項 - 未解決的符號)通常會產生錯誤。 此選項使其生成警告。

+0

標記爲答案,因爲它最接近我希望的解決方案。儘管如此,仍然需要應用程序的初始鏈接上提供的所有庫,但它們不必隨應用程序一起分發。 – 2010-08-06 10:48:20

+0

更新:使用-Wl, - warn-unresolved-symbols可以避免在應用程序鏈接時需要所有庫。 在這種情況下,開發人員需要檢查應用程序是否需要未解析的符號。 – 2010-08-06 11:08:53

7

可以,但你基本上做的所有的動態庫處理你自己。即dlopen庫,然後用dlsym直接查找您需要的符號。

它會讓你的代碼更復雜,多少取決於你進入庫的接口。

+0

這是一個很好的提示 - 但在我的情況下,這會引入太多的代碼更改。 – 2010-08-06 10:50:34