在调试函数符号冲突问题时,我发现 gcc 的一个奇怪行为我无法理解,通过以下示例代码说明:
主程序
#include <stdio.h>
int main()
{
b();
a();
}
交流
#include <stdio.h>
void a(void)
{
printf("func a in a\n");
}
公元前
#include <stdio.h>
void a()
{
printf("func a in b\n");
}
void b()
{
printf( "func b try to call a \n");
a();
}
编译:
gcc -c a.c
gcc -c b.c
ar -cr liba.a a.o
ar -cr libb.a b.o
gcc main.c liba.a libb.a
执行:
./a.out
func b try to call a
func a in b
func a in b
我的问题是:
- 为什么
a
在main
函数中调用函数a in b.c
而不是a in a.c
? - 更改 library order:
gcc main.c libb.a liba.a
后,结果是一样的。为什么? - 为什么链接器在这种情况下不报告符号冲突?