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)
为什么我的以下代码没有引发重复的符号冲突?
链接器按照在链接器行中指定的顺序在库中查找未定义的符号。在库中找到符号后,它将使用该定义并停止。它不会检查链接器行中指定的任何其他库中是否定义了该符号。
在您的情况下,如果链接器在A.lib中找到符号,它将在此处停止。它不会在B.lib中查找符号。
使用您的命令,链接器将在library printGood()
中的object perfect.o
中找到函数A
。它不会使用good.o
来自library 的同名功能B
。所以你有效链接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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
69 次 |
最近记录: |