假设我有两个不是由我构建的静态库,我无法控制它们的内容。
图书馆1有功能:
A()
B()
C()
图书馆2有功能:
A()
D()
E()
两者都需要链接到调用应用程序,但A()
的命名冲突会引发错误。
当使用gcc和ld在linux中链接时,有没有办法说“忽略库1中的A()”。
答案 0 :(得分:7)
我知道有几种方法:
您可以制作隐藏相关符号的库的副本,并链接到副本。您不需要访问库代码的任何源代码来执行此操作:objcopy
可以使用--localize-symbol
选项执行此操作。我在this answer中使用.o
文件描述了如何对类似的问题执行此操作,但同样的方法与.a
库的工作方式相同。
可以使用--allow-multiple-definition
option。 (如果您通过gcc
命令而不是直接与ld
进行链接,则需要将选项指定为-Wl,--allow-multiple-definition
。)这将导致链接器停止关心多重定义,只需使用它遇到的第一个 - 所以你必须要小心库在命令行中出现的顺序。它的缺点是它是一个全局选项,所以如果你有其他意想不到的符号冲突,它可能会做错事而不是告诉你它。