2012-01-26 50 views
8

假設我有兩個靜態庫,它們不是由我自己構建的,我無法控制其內容。防止從靜態庫導入函數

庫1具有如下功能:

A() 
B() 
C() 

庫2具有如下功能:

A() 
D() 
E() 

兩者都需要被鏈接到一個調用應用程序但A()命名衝突引發錯誤。

有沒有一種方法來說,當在linux中使用gcc和ld鏈接時,忽略庫1中的A()。

+0

可能值得一提的是您的工具鏈。通常的GNU gcc和ld? – Thomas

+0

添加它,它在GCC和ld中。 – tpg2114

回答

6

有一對夫婦的,我知道的方法:

  1. 你可以使具有相應的符號隱藏在庫的副本,並鏈接對抗副本。您不需要訪問庫代碼的任何源代碼就可以執行此操作:objcopy可以使用--localize-symbol選項執行此操作。我將描述如何使用.o文件this answer來解決類似的問題,但同樣的方法也適用於.a庫。

  2. --allow-multiple-definition option可以使用。 (如果通過gcc命令鏈接而不是直接鏈接到ld,則需要將該選項指定爲-Wl,--allow-multiple-definition。)這會導致鏈接器停止關注多重定義,並且只使用第一個定義遇到相反 - 所以你必須小心命令行中庫的順序。它的缺點是它是一個全球性的選擇,所以如果你有其他意想不到的符號衝突,它可能會停止做錯事而不是告訴你。