【发布时间】:2013-09-04 12:11:53
【问题描述】:
在调试函数符号冲突问题时,我发现 gcc 的一个奇怪行为我无法理解,通过以下示例代码说明:
main.c
#include <stdio.h>
int main()
{
b();
a();
}
交流
#include <stdio.h>
void a(void)
{
printf("func a in a\n");
}
b.c
#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
我的问题是:
- 为什么在
main函数中调用函数a是a in b.c而不是a in a.c? - 更改库顺序后:
gcc main.c libb.a liba.a,结果是一样的。为什么? - 为什么在这种情况下链接器不报告符号冲突?
【问题讨论】:
-
试试 gcc -c main.c liba.a libb.a
-
@LidongGuo 我试过了,请看我的第二个问题。
-
您在
main.c编译命令行中看到-c了吗?你没有链接你的程序,你只是编译main.c。如果您还要链接,请在最终编译中丢失-c。正如您所写的那样,您的命令甚至不会生成 a.out,所以我对您如何运行 anything 感到有些困惑。 -
@WhozCraig 这是一个打字错误,我修复它。
标签: c gcc shared-libraries unix-ar