C 为什么我的代码没有抛出重复的符号冲突
为什么我的以下代码没有引发重复符号冲突 我提到了名称mangling,但这似乎只是在参数存在差异时。但是,这里的参数没有区别。但是,它仍然没有引发冲突。为什么? 好的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() {
#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