Zac*_*ame 36 compiler-construction visual-studio-2005 visual-studio-2008 visual-studio visual-c++
您可以使用Visual Studio C++编译器使用几种不同的调试标志.他们是:
如果要启用最小重建,则/ Z7标志上需要/ Zi标志.
如果你打算使用/ MP标志,/ Z7和/ Zi看起来在MSDN上似乎没有区别.但是,SCons文档声明必须使用/ Z7来支持并行构建.
在Visual Studio C++项目中使用/ Zi vs/Z7有什么含义?
我错过了其中任何一种选择的其他优缺点吗?
具体来说,目标的单个程序数据库格式(PDB)文件与每个源的多个CodeView格式(.obj)文件的好处是什么?
Codeview是一种更老的调试格式,它是在20世纪80年代中期的"微软C编译器"时代与微软旧的独立调试器一起引入的.它在磁盘上占用更多空间,调试器解析需要更长的时间,在链接过程中处理起来很麻烦.当我在1998-2000中使用CodeWarrior for Windows时,我们从编译器生成了它.
一个优点是Codeview是一种文档格式,其他工具通常可以在它们无法处理PDB格式的调试数据库时进行处理.此外,如果您一次构建多个文件,则无法写入项目的调试数据库.但是,对于目前的大多数用途,使用PDB格式是一个巨大的胜利,无论是在构建时,尤其是在调试器启动时.
旧C7格式的一个优点是它是一体机,存储在EXE中,而不是单独的PDB和EXE.这意味着你永远不会有不匹配.VS开发工具将确保PDB在使用之前与其EXE匹配,但是只需一个EXE就可以更轻松地拥有所需的一切.
这增加了在发布时需要能够剥离调试信息的新问题,以及巨大的EXE文件,更不用说古老的格式和缺乏对minrebuild等其他现代功能的支持,但它仍然可以帮助您尽量让事情变得简单.一个文件比两个文件容易.
并不是说我曾经使用C7格式,我只是把它作为一个可能的优势,因为你问.
顺便说一句,这就是GCC在我正在使用的几个平台上做事情的方式.DWARF2格式隐藏在输出ELF中.Unix人认为他们太热闹了.:)
BTW可以使用DIA SDK解析PDB格式.
/Z7将调试信息以 CodeView 格式保存在 .obj 文件中,并让链接器将它们提取到 .pdb 中,同时/Zi在编译期间通过与 mspdbsrv.exe 同步将其合并到通用 .pdb 文件中。
这/Z7意味着更多的文件 IO、使用的磁盘空间以及链接器的更多工作(除非使用 /DEBUG:FASTLINK),因为这些 obj 文件中存在大量重复的调试信息。但这也意味着每个编译都是独立的,因此实际上仍然比/Zi足够的并行化更快。
到目前为止,他们已经/Zi通过减少与 mspdbsrv.exe 的进程间通信来改善这种情况: https: //learn.microsoft.com/en-us/cpp/build/reference/zf
的另一个用例/Z7是“独立”(虽然更大)静态库,如果您需要,不需要单独提供.pdb。vcxxx.pdb只要您不使用正确的https://learn.microsoft.com/en-us/cpp/build/reference/fd-program-修复它,这也可以防止 cl 使用可怕的默认名称引起的烦人问题。数据库文件名,大多数人都会忘记。
/ZI类似于/Zi但添加了附加数据等以使“编辑并继续”功能正常工作。