当调试函数符号冲突问题时,我发现gcc的一个奇怪的行为我无法理解,通过以下示例代码说明:
main.c中
int main(){ …
在传递给链接器的选项中,按从左到右的目标文件外观的顺序搜索目标文件中要解析的符号。
假设以下内容已经准备好连接:
gcc -c main.c gcc -c a.c gcc -c b.c ar -cr liba.a a.o ar -cr libb.a b.o
然后这个
gcc -o main main.o liba.a libb.a
会产生:
libb.a(b.o): In function `a': b.c:(.text+0x0): multiple definition of `a' liba.a(a.o):a.c:(.text+0x0): first defined here collect2: ld returned 1 exit status
链接器执行以下操作:
main.o 需求 a() 和 b () 。第一 liba 被搜查: a() 找到了, b() 不是。所以其次 libb 被搜查。 b() 找到了,但也 的 另一个 强> a() 导致上面显示的链接器错误。
main.o
a()
b ()
liba
b()
libb
如果做:
gcc -o main main.o libb.a liba.a
没有给出任何错误 main 被建造。
main
main.o 需求 a() 和 b () 。第一 libb 被搜查: a() 和 b() 被发现了。因为没有什么可以解决的了 <击> libb 击> liba 甚至没看过/在。
在后一种情况下,该程序( main 的输出是:
func b try to call a func a in b func a in b
链接器将做什么/显示所有其他可能的排列 main.o , liba.a 和 libb.a 留给读者的练习。 ;-)
liba.a
libb.a
你不包括在内 a 和 b 函数声明 main.c 。如果这样做,在传递给链接器之前,您将从编译器获得多个声明错误。你必须做错事 main.c 。
a
b
main.c