2

为什么我的以下代码不会引发重复符号冲突?

我提到了名称修饰,但这似乎仅在参数存在差异时。但是,这里的参数没有区别。但是,它仍然不会引发冲突。为什么?

好.c

#include <stdio.h>

void printGood() {
    printf("I am good");
}

完美的.c

#include <stdio.h>

void printGood() {
    printf("I am perfect");
}

交流电

extern void printGood();

void bringGood() {
    printGood();
}

公元前

extern void printGood();

void bringPerfect() {
    printGood();
}

编排器.c

#include <stdio.h>

void bringGood();
void bringPerfect();

int main() {
    printf("bringing good");
    bringGood();
    printf("bringing perfect");
    bringPerfect();
    return 1;
}

编译行:

gcc -g -c good.c
gcc -g -c perfect.c

gcc -g -c A.c
gcc -g -c B.c

gcc -g -c orchestrator.c

ar rcs libA.a perfect.o A.o
ar rcs libB.a  good.o B.o

gcc -o orchestrator orchestrator.o -L.  -lA -lB

4

1 回答 1

6

为什么我的以下代码不会引发重复符号冲突?

链接器按照它们在链接器行中指定的顺序在库中查找未定义的符号。当它在库中找到一个符号时,它会使用该定义并停止。它不检查该符号是否在链接器行中指定的任何其他库中定义。

在您的情况下,如果链接器在 A.lib 中找到一个符号,它就会停在那里。它不在 B.lib 中查找符号。

使用您的命令,链接器将在 libraryprintGood()的 object中找到函数。它不会使用from library中的同名函数。因此,您可以有效地链接、和。这就是为什么可执行程序打印两次而不是.perfect.oAgood.oBorchestrator.oA.oB.operfect.oI am perfectI am good

仅当链接器行中使用的目标文件包含多个定义时,才会报告多个定义错误。

如果您使用以下命令,您将看到错误:

gcc -o orchestrator orchestrator.o a.o b.o perfect.o good.o
于 2019-08-21T16:27:52.190 回答