为什么我的代码没有引发重复的符号冲突

ele*_*der 2 c linker duplicate-symbol

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

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

#include <stdio.h>

void printGood() {
    printf("I am good");
}
Run Code Online (Sandbox Code Playgroud)

完美的

#include <stdio.h>

void printGood() {
    printf("I am perfect");
}
Run Code Online (Sandbox Code Playgroud)

交流电

extern void printGood();

void bringGood() {
    printGood();
}
Run Code Online (Sandbox Code Playgroud)

公元前

extern void printGood();

void bringPerfect() {
    printGood();
}
Run Code Online (Sandbox Code Playgroud)

编排器

#include <stdio.h>

void bringGood();
void bringPerfect();

int main() {
    printf("bringing good");
    bringGood();
    printf("bringing perfect");
    bringPerfect();
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

编译行:

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

Run Code Online (Sandbox Code Playgroud)

R S*_*ahu 6

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

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

在您的情况下,如果链接器在A.lib中找到符号,它将在此处停止。它不会在B.lib中查找符号。

使用您的命令,链接器将在library printGood()中的object perfect.o中找到函数A。它不会使用good.o来自library 的同名功能B。所以你有效链接orchestrator.oA.oB.operfect.o。这就是可执行程序打印I am perfect两次而不打印两次的原因I am good

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

如果使用以下命令,则会看到错误:

gcc -o orchestrator orchestrator.o a.o b.o perfect.o good.o
Run Code Online (Sandbox Code Playgroud)