Windows C++库后缀‘z’‘d’‘zd’分别代表什么含义?
z的常见含义 你猜的没错,后缀d确实代表调试(Debug)版本——这类库包含了调试器需要的完整符号信息,能让你在调试时看到变量名、函数名和调用栈,所以体积比Release版的core.lib略大一点(850KB vs 800KB完全符合这个规律)。
至于后缀z,因为第三方库的命名规则通常是厂商自定义的,没有统一标准,但结合它体积暴涨的特点,最常见的几种可能性是:
带完整符号的Release版本
很多厂商会把Release库做两种分发:一种是core.lib这种剥离了符号的版本(体积小,适合正式发布),另一种是corez.lib这种保留全部调试符号的Release版本。这种版本兼顾了Release的性能,又能在生产环境出问题时进行调试,符号信息占了大量空间,所以体积会从几百KB涨到几十MB,完全符合你看到的情况。静态链接了所有依赖的版本
有些厂商会用z来标记“全量静态链接”的版本——也就是说corez.lib已经把它依赖的CRT(C运行时库)、其他第三方依赖库都静态打包进去了,而普通的core.lib需要动态依赖这些库。这种情况下,库的体积也会大幅增加,因为包含了更多的代码。开启优化但保留调试信息的版本
还有一种可能是,d后缀的库是未优化的纯调试版,而z后缀的是开启了Release级优化但保留调试符号的版本。这种版本运行速度和Release版一样快,但能像Debug版一样调试,符号和优化后的代码叠加起来,体积也会比纯Release版大很多。
如果想彻底搞清楚,你可以用Visual Studio自带的dumpbin工具分析一下:
- 运行
dumpbin /SYMBOLS ...corez.lib,看看输出里是不是有大量的符号条目,就能判断是不是带完整符号的版本; - 运行
dumpbin /DEPENDENTS ...corez.lib,对比core.lib的依赖项,就能知道是不是静态链接了更多库。
内容的提问来源于stack exchange,提问作者code_fodder

