为什么我的以下代码没有引发重复符号冲突?
我提到了名称修改,但这似乎只是在参数不同的情况下。但是,这里的参数没有区别。但是,它仍然不会引发冲突。为什么?
好.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();
}
orchestrator.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
最佳答案
Why is my following code not throwing duplicate symbol conflict?
链接器按照在链接器行中指定的顺序在库中查找 undefined symbol 。当它在库中找到符号时,它会使用该定义并停止。它不检查该符号是否在链接器行中指定的任何其他库中定义。
在您的情况下,如果链接器在 A.lib 中找到一个符号,它就会停在那里。它不会在 B.lib 中查找符号。
使用您的命令,链接器将在库 A
的对象 perfect.o
中找到函数 printGood()
。它不会使用库 B
中的 good.o
中的同名函数。因此,您有效地链接了 orchestrator.o
、A.o
、B.o
和 perfect.o
。这就是为什么可执行程序打印两次 I am perfect
而不是 I am good
的原因。
仅当链接器行中使用的目标文件包含多个定义时才会报告多个定义错误。
如果您使用:
gcc -o orchestrator orchestrator.o a.o b.o perfect.o good.o
关于c - 为什么我的代码没有引发重复符号冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57595736/