8
假設我有兩個靜態庫,它們不是由我自己構建的,我無法控制其內容。防止從靜態庫導入函數
庫1具有如下功能:
A()
B()
C()
庫2具有如下功能:
A()
D()
E()
兩者都需要被鏈接到一個調用應用程序但A()
命名衝突引發錯誤。
有沒有一種方法來說,當在linux中使用gcc和ld鏈接時,忽略庫1中的A()。
假設我有兩個靜態庫,它們不是由我自己構建的,我無法控制其內容。防止從靜態庫導入函數
庫1具有如下功能:
A()
B()
C()
庫2具有如下功能:
A()
D()
E()
兩者都需要被鏈接到一個調用應用程序但A()
命名衝突引發錯誤。
有沒有一種方法來說,當在linux中使用gcc和ld鏈接時,忽略庫1中的A()。
有一對夫婦的,我知道的方法:
你可以使具有相應的符號隱藏在庫的副本,並鏈接對抗副本。您不需要訪問庫代碼的任何源代碼就可以執行此操作:objcopy
可以使用--localize-symbol
選項執行此操作。我將描述如何使用.o
文件this answer來解決類似的問題,但同樣的方法也適用於.a
庫。
--allow-multiple-definition
option可以使用。 (如果通過gcc
命令鏈接而不是直接鏈接到ld
,則需要將該選項指定爲-Wl,--allow-multiple-definition
。)這會導致鏈接器停止關注多重定義,並且只使用第一個定義遇到相反 - 所以你必須小心命令行中庫的順序。它的缺點是它是一個全球性的選擇,所以如果你有其他意想不到的符號衝突,它可能會停止做錯事而不是告訴你。
可能值得一提的是您的工具鏈。通常的GNU gcc和ld? – Thomas
添加它,它在GCC和ld中。 – tpg2114