链接器如何找到正确的库?
How the linker find the correct library?
我知道什么是预处理,编译器是如何工作的,以及 linker link 如何处理 object 文件
但我仍然无法回答的是:
在一个IDE像VS
假设我们有一个名为 DariushTest.o
的库实现了一个名为 print()
的函数,并且有一个名为 test.h
的 header 文件
我们还有其他库实现了 print()
函数
但我们不在我们的代码中包含他们的 header 文件
假设我们在代码中包含 test.h
header 并且我们在主函数
中使用 print()
函数
现在!如果有几个库实现了这个功能。
代码编译后,linker如何找出这段代码与哪个库相关,应该与哪个文件相关link?
我问这个问题的原因是 header 文件没有连接到 DariushTest.o 文件,编译器不关心它。
那么 linker link 是 DariushTest.o
中的 print()
函数而不是其他库中的函数?
link 人如何找到正确的图书馆?
那么链接器如何链接来自 DariushTest.o 而不是来自其他库的 print() 函数?
没有。如果您通过在 2 个不同的编译单元中使用相同的函数名称来打破 ODR,则程序的行为是未定义的。链接器可能会注意到并诊断重新定义,也可能不会。
我知道什么是预处理,编译器是如何工作的,以及 linker link 如何处理 object 文件
但我仍然无法回答的是:
在一个IDE像VS
假设我们有一个名为 DariushTest.o
的库实现了一个名为 print()
的函数,并且有一个名为 test.h
的 header 文件
我们还有其他库实现了 print()
函数
但我们不在我们的代码中包含他们的 header 文件
假设我们在代码中包含 test.h
header 并且我们在主函数
print()
函数
现在!如果有几个库实现了这个功能。
代码编译后,linker如何找出这段代码与哪个库相关,应该与哪个文件相关link?
我问这个问题的原因是 header 文件没有连接到 DariushTest.o 文件,编译器不关心它。
那么 linker link 是 DariushTest.o
中的 print()
函数而不是其他库中的函数?
link 人如何找到正确的图书馆?
那么链接器如何链接来自 DariushTest.o 而不是来自其他库的 print() 函数?
没有。如果您通过在 2 个不同的编译单元中使用相同的函数名称来打破 ODR,则程序的行为是未定义的。链接器可能会注意到并诊断重新定义,也可能不会。