2012-01-26 126 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。)这会导致链接器停止关注多重定义,并且只使用第一个定义遇到相反 - 所以你必须小心命令行中库的顺序。它的缺点是它是一个全球性的选择,所以如果你有其他意想不到的符号冲突,它可能会停止做错事而不是告诉你。