【发布时间】:2018-03-23 17:35:13
【问题描述】:
我有两个文件 foo.c 和 foo2.c 完全相同。如果我链接到它们两个,那么链接器将抛出一个错误,抱怨多个函数定义。
但是如果我首先将一个文件编译成静态库并链接到另一个目标文件和库,那么链接过程会正常完成。我在 Ubuntu 16.04 上使用 gcc 5.4.0。
foo.c 和 foo2.c:
#include <stdio.h>
void fooxyz(void) {
printf("foo\n");
}
main.c:
#include <stdio.h>
void fooxyz(void);
int main(void) {
fooxyz();
return 1;
}
现在将 foo2 编译并归档到 libfoo2.a 中:
$ gcc -c main.c foo.c foo2.c
$ ar rcs libfoo2.a foo2.o
$ gcc -o main main.o foo.o -L. -lfoo2
$ ./main
foo
为什么链接器不会抛出关于函数fooxyz的多重定义的错误,因为它是在两个地方定义的?谢谢。
【问题讨论】: