【问题标题】:How the linker find the correct library?链接器如何找到正确的库?
【发布时间】:2021-04-03 17:38:35
【问题描述】:

我知道什么是预处理,编译器如何工作,以及链接器如何链接目标文件

但我仍然无法回答的是:

在像 VS 这样的 IDE 中

假设我们有一个名为 DariushTest.o 的库,它实现了一个名为 print() 的函数,并有一个名为 test.h 的头文件 我们还有其他实现print() 函数的库 但是我们没有在我们的代码中包含他们的头文件 假设我们在代码中包含test.h 标头,并且在主函数中使用print() 函数

现在!如果有几个库实现了这个功能。

编译代码后,链接器如何找出这段代码与哪个库相关,以及它应该链接到哪个文件?

我问这个问题的原因是头文件没有连接到DariushTest.o文件,编译器不关心它。

那么链接器如何从DariushTest.o 链接print() 函数而不是从其他库? 链接器如何找到正确的库?

【问题讨论】:

    标签: c++ c++11 visual-c++ ide lib


    【解决方案1】:

    那么链接器如何链接来自 DariushTest.o 的 print() 函数而不是来自其他库的呢?

    它没有。如果您通过在 2 个不同的编译单元中使用相同的函数名称来破坏 ODR,则程序的行为是未定义的。链接器可能会注意到并诊断重新定义,也可能不会。

    【讨论】:

    • 所以你的意思是如果我的库目录中有另一个库具有打印功能,它可能会在链接阶段出错?
    • @DariushStony 仅当您将这两个库链接到您的程序时,一个体面的链接器才会检测到这一点并失败。如果同一个库未链接但位于同一目录中,则无论如何都不会影响您的程序。
    猜你喜欢
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    相关资源
    最近更新 更多