VS 2013 /Zi 编译器选项使静态库的大小翻倍
Posted
技术标签:
【中文标题】VS 2013 /Zi 编译器选项使静态库的大小翻倍【英文标题】:VS 2013 /Zi Compiler Option doubles size of static library 【发布时间】:2016-01-04 13:42:49 【问题描述】:我想知道为什么在 VS 2013 下 /Zi 编译器选项几乎使构建静态库的大小增加了一倍。
据我了解 /Zi 选项,所有生成的调试信息都存储在 .pdb 文件中,并且只为每个 .obj 文件添加指向该文件的链接。
似乎只有 .exe 和 .dll 文件大小保持不变,无论选项是 /Zi 还是 None。
我只能使用 VS 2013 进行测试,所以我不知道其他版本的 VS 是否也会发生这种情况。
【问题讨论】:
【参考方案1】:这主要来自于.debug$S部分的增加。原因是当使用 PDB 时,并非所有关于 debug 的内容都放入 pdb,调试符号仍然保存在 h object/lib 文件的 .debug$S 部分中。放入 pdb 的内容至少包含类型信息,这就是使用 /Zi 或 /ZI 时 .debug$T 变得非常小的原因,即在这些情况下它只包含指向 pdb 文件的指针。
你可以使用
dumpbin.exe your_lib.lib
显示结果。
对于大型库,大小可以从 4MB 增加到 20MB。
对于一个非常简单的库:
没有调试:
4 .bss
60 .chks64
138 .debug$S
D2 .drectve
18 .pdata
8 .rtc$IMZ
8 .rtc$TMZ
2C .text$mn
10 .xdata
/子:
4 .bss
98 .chks64
848 .debug$S
E0 .debug$T
113 .drectve
4 .msvcjmc
18 .pdata
8 .rtc$IMZ
8 .rtc$TMZ
76 .text$mn
10 .xdata
/ZI:
4 .bss
C0 .chks64
1454 .debug$S
E0 .debug$T
135 .drectve
4 .msvcjmc
18 .pdata
8 .rtc$IMZ
8 .rtc$TMZ
89 .text$mn
20 .xdata
/Z7:调试信息现在嵌入到 .debug$P 部分,.debug$S 也缩小了一点。
4 .bss
98 .chks64
1210 .debug$P
848 .debug$S
78C .debug$T
113 .drectve
4 .msvcjmc
18 .pdata
8 .rtc$IMZ
8 .rtc$TMZ
76 .text$mn
10 .xdata
【讨论】:
以上是关于VS 2013 /Zi 编译器选项使静态库的大小翻倍的主要内容,如果未能解决你的问题,请参考以下文章
VS中Debug和Realease及静态库和动态库的区别整理(转)
动态库与静态库的区别在windows及linux环境下的制作及用法