我有两个文件foo.cfoo2.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/

10-17 00:32