例如,如果我静态链接到freeglut,编译器是否包含freeglut中的所有内容或仅包含我使用的部分?当然,这意味着链接器(或编译器?)会进行某种依赖性分析,以找出它可以安全排除的内容。
如果是这样,有没有办法查看Visual Studio中包含或排除的内容?
答案 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和几个派生自它的类。
在真正的主程序中,只需使用其中一个子类。
然后打印所有名称。
然后你会找到答案,我想。