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

标签 c linker duplicate-symbol

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

我提到了名称修改,但这似乎只是在参数不同的情况下。但是,这里的参数没有区别。但是,它仍然不会引发冲突。为什么?

好.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.oA.oB.operfect.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/

相关文章:

c++ - 关于链接器命令失败,退出代码为 1

c++ - xcode (C++) 中的随机重复符号

c++ - 为什么 C 编译器会丢弃我的 &0xFF 掩码?

c - 函数 err_sys() 在哪里定义?

c - 如何使用 c 中的套接字 api 一次性发送 .bmp 文件?

c++ - 不能使用隐式链接的 .dll 中的类

python - 我可以用 C 重写昂贵的 pygame 函数吗?

c++ - 在 OSX 上与 C++ 中的 libconfig 链接

c - 如何在 Visual Studio 2012 中链接 .a 文件?

c - 为什么这不是重复符号错误?