链接器不会通知多个定义

时间:2018-03-23 17:35:14

标签: c gcc linker

我有两个文件foo.cfoo2.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的多重定义的错误,因为它是在两个地方定义的?感谢。

1 个答案:

答案 0 :(得分:2)

  

但是如果我先将一个文件编译成静态库并链接到另一个目标文件和库,那么链接过程就会正常完成。我在Ubuntu 16.04上使用gcc 5.4.0。

这是预期的。

只有在链接的任何目标文件中未定义符号时,才使用库中的符号。