tpg*_*114 9 linux linker gcc ld static-libraries
假设我有两个不是由我构建的静态库,我无法控制它们的内容.
库1具有以下功能:
A()
B()
C()
Run Code Online (Sandbox Code Playgroud)
图书馆2有以下功能:
A()
D()
E()
Run Code Online (Sandbox Code Playgroud)
两者都需要链接到调用应用程序,但A()抛出错误的命名冲突.
有没有办法在使用gcc和ld在linux中链接时"忽略库1中的A()".
我知道有几种方法:
您可以制作隐藏相关符号的库的副本,并链接到副本.您不需要访问库代码的任何源代码来执行此操作:objcopy可以使用该--localize-symbol选项执行此操作.我.o在这个类似问题的答案中描述了如何使用文件执行此操作,但同样的方法也适用于.a库.
可以使用该--allow-multiple-definition选项.(如果您通过gcc命令而不是ld直接链接,则需要将选项指定为-Wl,--allow-multiple-definition.)这将导致链接器停止关注多重定义,并简单地使用它遇到的第一个 -所以你必须要小心库在命令行中出现的顺序.它的缺点是它是一个全局选项,所以如果你有其他意想不到的符号冲突,它可能完全做错了而不是告诉你它.