C 为什么我的代码没有抛出重复的符号冲突

C 为什么我的代码没有抛出重复的符号冲突,c,linker,duplicate-symbol,C,Linker,Duplicate Symbol,为什么我的以下代码没有引发重复符号冲突 我提到了名称mangling,但这似乎只是在参数存在差异时。但是,这里的参数没有区别。但是,它仍然没有引发冲突。为什么? 好的 #include <stdio.h> void printGood() { printf("I am good"); } 不列颠哥伦比亚省 编曲 #include <stdio.h> void bringGood(); void bringPerfect(); int main() {

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

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

好的

#include <stdio.h>

void printGood() {
    printf("I am good");
}
不列颠哥伦比亚省

编曲

#include <stdio.h>

void bringGood();
void bringPerfect();

int main() {
    printf("bringing good");
    bringGood();
    printf("bringing perfect");
    bringPerfect();
    return 1;
}
为什么我的以下代码没有引发重复符号冲突

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

在您的例子中,如果链接器在a.lib中找到一个符号,它将停止在那里。它不在B.lib中查找符号

使用您的命令,链接器将在库
A
中的对象
perfect.o
中找到函数
printGood()
。它不会在库
B
中的
good.o
中使用同名函数。因此,您可以有效地链接
orchestrator.o
A.o
B.o
perfect.o
。这就是为什么可执行程序会打印两次“我很完美”,而不是“我很好”

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

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

gcc -o orchestrator orchestrator.o a.o b.o perfect.o good.o

@弗拉德夫罗姆莫斯科似乎OP没有得到链接时间错误,并询问为什么会发生这种情况。
extern void printGood();

void bringPerfect() {
    printGood();
}
#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

gcc -o orchestrator orchestrator.o a.o b.o perfect.o good.o