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

标签 c++ c visual-studio-2010

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

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

最佳答案

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

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

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

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

但是,使用该选项,您会得到真正详细的输出。

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

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

关于c++ - 静态链接时,链接器是否包含整个库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9647212/

相关文章:

C++ GRPC ClientAsyncReaderWriter : how to check if data is available for read?

c++ - 将唯一 ID 映射到对象的数据结构

c - 用空格查找并替换数组中的制表符?

visual-studio-2010 - 如何最大化 Visual Studio 面板?

visual-studio-2010 - Visual Studio : Can't View Files in a Directory in Project

c - mulcross数据生成器运行错误: free():invalid next size

c++ - 具有共享所有者语义的容器

c - 二进制常量前的keil uvision 5语法错误

c - 在结构体中写入数组

c++ - pegtl - 如何跳过整个语法的空格