如何合并多个PDB文件?

blt*_*txd 8 command-line visual-c++ pdb-files

我们目前正在使用单一命令行工具在Windows和Linux上构建我们的产品.

Si很好地工作,允许我们构建源代码和更好的依赖关系比我们以前的构建系统允许的.这为我们带来了很好的增量和并行构建功能.

为了简要描述构建过程,我们得到通常的:

.cpp -- cl.exe --> .obj and .pdb
multiple .obj and .pdb -- cl.exe --> single .dll .lib .pdb
multiple .obj and .pdb -- cl.exe --> single .exe .pdb
Run Code Online (Sandbox Code Playgroud)

msvc C/C++编译器可以充分支持它.

最近出现了构建一些静态库的需求.根据我们收集的内容,构建静态库的过程如下:

multiple .cpp -- cl.exe --> multiple .obj and a single .pdb
multiple .obj -- lib.exe --> a single .lib
Run Code Online (Sandbox Code Playgroud)

单个.pdb意味着cl.exe只应对所有.cpp源执行一次.这种单一执行意味着我们无法并行化此静态库的构建.这真的很不幸.

我们进一步调查并根据文档(和可用的命令行选项):

  • cl.exe 不知道如何构建静态库
  • lib.exe 不知道如何构建.pdb文件

有人知道合并多个PDB文件的方法吗?我们注定要为静态库建立慢速构建吗?像Incredibuild这样的工具如何解决这个问题?

Pre*_*gha 5

我已经很长时间没有完成C++了,但是从这篇文章来看,这似乎是一种性能技巧来阻止公共标题的符号重新创建.

您可以尝试使用/ Z7在每个obj中嵌入信息,而不是创建PDB,然后使用如本文中的rebase链接并重新创建它.


jan*_*anm 5

无需合并PDB文件.

使用/ Z7编译源文件以避免在CL.EXE步骤期间创建PDB.

使用LIB.EXE创建包含嵌入式调试信息的静态库.使用LINK.EXE而不是CL.EXE进行链接,使用/ PDB指定调试信息的去向.

如果使用EXE和一个或多个DLL调试进程,请为调试器提供每个映像(EXE或DLL)的PDB.