我有两个文件foo.c
和foo2.c
完全相同。如果我链接到这两个函数,那么链接器将抛出一个错误,抱怨多个函数定义。
但是,如果我首先将一个文件编译成静态库并链接到另一个对象文件和库,那么链接过程将正常完成。我在Ubuntu 16.04上使用gcc 5.4.0。
foo.c和foo2.c:
#include <stdio.h>
void fooxyz(void) {
printf("foo\n");
}
主要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
的多重定义错误,因为它是在两个地方定义的?谢谢。 最佳答案
但是,如果我首先将一个文件编译成静态库并链接到另一个对象文件和库,那么链接过程将正常完成。我在Ubuntu 16.04上使用gcc 5.4.0。
这是意料之中的。
只有在链接的任何对象文件中未定义库中的符号时,才使用库中的符号。
关于c - 链接器不会通知多个定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49455446/