静态库如何链接到依赖项

How do static libraries do linking to dependencies?

本文关键字:依赖 链接 何链接 静态      更新时间:2023-10-16

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

谢谢

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

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

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

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

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