为啥生成 pdb 文件会导致静态链接库的大小大幅增加?

Posted

技术标签:

【中文标题】为啥生成 pdb 文件会导致静态链接库的大小大幅增加?【英文标题】:Why is generating pdb file causing static linked library to increase largely in size?为什么生成 pdb 文件会导致静态链接库的大小大幅增加? 【发布时间】:2014-10-15 10:41:09 【问题描述】:

在构建小型应用程序 (LZO) 时,我注意到发布版本没有生成 pdb 文件。我们通常倾向于生成(但不是必须部署)pdb 文件以及库本身。

现在我使用/Zi 开关打开 pdb 文件并注意到一个奇怪的地方。 pdb 文件生成良好,大约 100kb,但静态链接器库从 259 kb 增长到 622 kb,我不明白为什么。

Here is a related thread可执行文件的讨论增长,但由于我没有构建最终的可执行文件,因此没有代码没有被优化掉(/OPT:NOREF 开关)。

我希望 pdb 文件包含代码的哪一部分属于源等的地址,当然我希望 lib 文件包含 pdb 位置的编译路径,但是使用十六进制编辑器读取更大的 lib 会发现一个很大的大量的视觉工作室路径,自己的包含路径等被编译到其中。加上一些非文本二进制数据。 为什么这是在 lib 本身而不是在 pdb 中导致 lib 增长?

【问题讨论】:

这个问题只是出于好奇还是会给您带来问题? @RogerRowland 没问题,它只是不符合我目前对 lib 文件内容的理解。 【参考方案1】:

静态库增长的原因是因为 PDB 文件的完全限定路径名与 .lib 文件中的每个目标文件相关联。

因此,如果您的 PDB 文件名长度为 30 个字符,并且您在 .lib 中有 100 个目标文件,那么总文件大小将至少增加 3000 个字节。

这对于 .DLL 或 .EXE 文件来说不是问题,因为它们只包含一个引用 PDB 文件名。

【讨论】:

以上是关于为啥生成 pdb 文件会导致静态链接库的大小大幅增加?的主要内容,如果未能解决你的问题,请参考以下文章

VS 2013 /Zi 编译器选项使静态库的大小翻倍

如何使用cmake生成基于静态库的动态链接库

并行构建 Visual Studio 解决方案会丢失一些静态库的 PDB

发布生成 .pdb 文件,为啥?

为啥链接库的顺序有时会导致 GCC 出错?

为啥链接库的顺序有时会导致 GCC 出错?