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环境下的制作及用法

求问vs2013怎么添加静态库,试了两种方法都有问题

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

VS 错误 D8016 “/ZI”和“/Gy-”命令行选项不兼容 ”问题

VS 错误 D8016 “/ZI”和“/Gy-”命令行选项不兼容 ”问题