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

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

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

这部分是一个实施质量问题,但有一个真正的问题。

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

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

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

但是,使用该选项可以获得非常详细的输出。

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

不过,这个输出也非常冗长。

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

如果为可执行文件生成映射文件,则可以确切地看到它包含的内容。

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

可能, 关于检查* .lib文件的问题,回答第二部分(dumpbin也适用于* .exe文件)。

我想你可以写一个样本库来得到答案。 在C ++库中,1编写一个类来打印所有子类名称。 2和几个派生自它的类。

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

然后打印所有名称。

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