2011-10-20 108 views
11

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

由于

回答

14

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

This thread讨论了它在Linux中的情况。

+0

如果我不希望产生的可执行文件有负担,我该怎么办? – jmasterx

+1

@Milo:您可以将libSomthing的依赖关系的静态库链接到libA中。 –

+0

@Milo:即你不想共享依赖关系?那么你只需要静态链接所有东西,只使用静态库。这将导致一个没有依赖关系的大型自包含可执行文件。但要注意的是,建立一些静态图书馆是很困难的。 – vines

4

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

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

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

6

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