【问题标题】:How does a linker know what all libraries to link?链接器如何知道要链接的所有库?
【发布时间】:2012-02-12 11:50:47
【问题描述】:

来自http://www.learncpp.com/cpp-tutorial/19-header-files/

链接器如何知道它需要包含标准运行时库,例如在 iostream 中声明的函数的定义在其他地方不存在?

是否有一些有助于链接过程的映射?

重新表述 - 如果我包含一些只有函数声明的文件,任何链接器如何确定函数定义的位置?

【问题讨论】:

  • 对于 Linux 环境,此类信息存储在 gcc 生成的 elf 文件中。

标签: c++ gcc compiler-construction linker


【解决方案1】:

如果您使用g++,它将始终链接标准 c++ 库 (-lstdc++)。

要绕过它,您可以使用gcc 并链接不同的库。

编辑:链接器不知道任何东西。标准库是自动链接的,所以对于标准函数没有什么要弄清楚的。如果您只是声明了一些不在 STL 中的内容并尝试在没有实际定义的情况下使用它,则链接器将失败。您必须手动链接库/.o。

【讨论】:

  • 顺便问一下,整个标准库总是链接的吗?我的意思是:例如假设我只使用了printf 函数。那么,是只链接了包含printf的二进制文件还是链接了整个标准库的二进制文件?
【解决方案2】:

这只是链接器的默认设置之一。一般来说,如果您不想使用标准库,您可以告诉它链接它们。

而且您总是必须明确告诉链接器链接到您的应用程序使用的任何其他库。它不会仅仅根据包含的声明“找出”函数定义的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多