静态链接时,链接器是否包含整个库?

时间:2012-03-10 14:29:25

标签: c++ c visual-studio-2010

例如,如果我静态链接到freeglut,编译器是否包含freeglut中的所有内容或仅包含我使用的部分?当然,这意味着链接器(或编译器?)会进行某种依赖性分析,以找出它可以安全排除的内容。

如果是这样,有没有办法查看Visual Studio中包含或排除的内容?

4 个答案:

答案 0 :(得分:7)

这部分是执行质量问题,但确实存在问题。

即,根据标准,链接器必须添加引用的所有编译单元。但是说在库中,你有一个编译单元,只有一个静态变量,其初始化注册某些注册表,例如消息处理,工厂,无论或者它的构造函数和析构函数输出,分别是“在main之前”和“在main之后”。如果引用了该编译单元中的任何内容,则链接器就可以跳过它,将其删除。

因此,为了确保不会优化这些静态变量,使用符合标准的工具链,在该编译单元中引用某些内容是必要且充分的。

在Visual Studio中重新看到已包含的内容,据我所知,除了要求链接器的详细输出之外没有办法,例如链接器选项/verbose:ref

但是,使用该选项,您将获得真正详细输出。

另一种方法是向链接器询问映射文件,例如链接器选项/map:blah

此外,此输出非常详细。

答案 1 :(得分:5)

是的,链接器将仅包含代码引用的翻译单元。

如果您为可执行文件生成了一个地图文件,那么您可以准确地看到它包含的内容。

答案 2 :(得分:3)

链接器仅包含所需的符号。

问题about inspecting *.lib files可能会回答第二部分(dumpbin也适用于* .exe文件)。

答案 3 :(得分:-1)

我认为你可以编写一个示例库来获得答案。 在C ++库中, 1编写一个类来打印所有子类名。 2和几个派生自它的类。

在真正的主程序中,只需使用其中一个子类。

然后打印所有名称。

然后你会找到答案,我想。