我想知道为什么在VS 2013下,/ Zi编译器选项几乎将构建静态库的大小加倍。
据我所知/ / Zi选项,所有生成的调试信息都存储在.pdb文件中,并且只为每个.obj文件添加了指向该文件的链接。
似乎只有.exe和.dll文件大小保持不变,无论选项是/ Zi还是None。
我只能使用VS 2013测试这个,所以我不知道这是否也会与其他版本的VS一起发生。
答案 0 :(得分:0)
这主要来自于.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