【问题标题】:How do static libraries do linking to dependencies?静态库如何链接到依赖项?
【发布时间】:2011-12-12 02:50:00
【问题描述】:

假设我有 libA。例如,它依赖于 libSomething,因为 libA 的非内联方法调用 libSomething.h 中的方法这一简单事实。在这种情况下,依赖关系如何联系起来? libA 在编译时是否必须静态链接到 libSomething,或者 libA 的用户(使用 libA 的应用程序)是否需要同时链接到 libA 和 libSomething?

谢谢

【问题讨论】:

    标签: c++ c linker static-libraries


    【解决方案1】:

    静态链接只是将整个项目(函数、常量等)复制到生成的可执行文件中。如果静态库的代码包含对某些共享库项的引用,这些引用将成为生成的可执行文件中的依赖项。如果您链接库而不是可执行文件,则同样如此。

    This thread 讨论它在 Linux 中是如何发生的。

    【讨论】:

    • 如果我不希望生成的可执行文件有负担,我该怎么办?
    • @Milo:你可以将 libSomthing 依赖的静态库链接到 libA 中。
    • @Milo:也就是说,你不想共享依赖?然后你只需要静态链接所有东西,只使用静态库。这将产生一个没有依赖关系的大型独立可执行文件。但请注意,将一些库构建为静态库是很困难的。
    【解决方案2】:

    静态库或多或少是未链接的二进制对象文件(*.o 或 *.obj)的简单存档,在编译存档时,不会检查依赖项。当一个人链接一个二进制可执行文件(或共享库/DLL)时,链接器会检查所有必要的依赖关系,然后才会提醒您任何问题。

    【讨论】:

      【解决方案3】:

      在构建过程中,编译器将代码转换为临时格式,我们称之为目标文件。在目标文件中,有一个编译器无法解析的符号列表,通常是其他地方的定义。链接阶段负责解析这些符号。

      构建过程将文件提供给链接器,直到所有符号都被解析。没有物理依赖列表,只有要解析的符号列表。这允许通过使用不同的库来解析符号。例如,一个人可能想使用一个 Windows 库来解决 Windows 特定的问题;针对 linux 特定问题的 linux 库。这并没有明确说明程序依赖于 Windows 库;它也可能依赖于Linux。

      一些编译器可以生成依赖列表,通常用于构建过程。不过,最终的责任还是在程序员身上。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-22
        • 2013-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-17
        相关资源
        最近更新 更多