我有两个文件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
的多重定义的错误,因为它是在两个地方定义的?感谢。
答案 0 :(得分:2)
但是如果我先将一个文件编译成静态库并链接到另一个目标文件和库,那么链接过程就会正常完成。我在Ubuntu 16.04上使用gcc 5.4.0。
这是预期的。
只有在链接的任何目标文件中未定义符号时,才使用库中的符号。