我知道什么是预处理、编译器如何工作以及链接器如何链接目标文件。
但我还没能回答的是:
在 VS 这样的 IDE 中
假设我们有一个名为
DariushTest.o
的库,它实现了一个名为 print()
的函数,并且有一个名为 test.h
的头文件
我们还有其他库实现了 print()
函数
但我们不将它们的头文件包含在我们的代码中。
假设我们在代码中包含 test.h
标头,并在主函数中使用 print()
函数。
现在!如果有几个库已经实现了这个功能:
我问这个问题的原因是头文件没有连接到 DariushTest.o 文件,编译器不关心它。
那么链接器如何从
print()
而不是从其他库链接 DariushTest.o
函数呢?
链接器如何找到正确的库?
那么链接器如何链接 DariushTest.o 中的 print() 函数而不是其他库中的 print() 函数?
事实并非如此。如果通过在 2 个不同的编译单元中使用相同的函数名称来破坏 ODR,则程序的行为是未定义的。链接器可能会注意到并诊断重新定义,但也可能不会。