例如,如果我静态链接到 freeglut,编译器是包含来自 freeglut 的所有内容还是仅包含我使用的部分?当然,这意味着链接器(或编译器?)会进行某种依赖分析以找出它可以安全排除的内容。
如果是这样,有没有办法查看 Visual Studio 中包含或排除的内容?
最佳答案
这部分是实现质量问题,但确实存在问题。
也就是说,按照标准,链接器必须添加所有被引用的编译单元。但是说在库中,你有一个编译单元,除了一个静态变量之外什么都没有,它的初始化注册了一些东西注册表,例如消息处理、工厂等,或者可能是它的构造函数和析构函数输出,分别是“在 main 之前”和“在 main 之后”。如果没有引用该编译单元中的任何内容,则链接器有权跳过它,将其删除。
因此,为了确保此类静态变量不会被优化掉,使用符合标准的工具链,引用该编译单元中的某些内容是必要且足够的。
在 Visual Studio 中重新查看已包含的内容,据我所知,除了要求链接器提供详细输出之外别无他法,例如链接器选项 /verbose:ref
。
但是,使用该选项,您会得到真正详细的输出。
另一种方法是向链接器询问 map 文件,例如链接器选项 /map:blah
.
不过,这个输出也非常冗长。
关于c++ - 静态链接时,链接器是否包含整个库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9647212/