静态库如何链接到依赖项?

时间:2011-10-20 20:36:11

标签: c++ c linker static-libraries

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

由于

3 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:6)

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

答案 2 :(得分:4)

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

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

某些编译器可以生成依赖项列表,通常用于构建过程。但是,最终的责任取决于程序员。