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