我正在尝试从静态 C++ 库创建 NuGet 包。我在本地 Azure DevOps 服务器中有一个构建管道,并且尝试使用针对构建时生成的 .pdb 的发布符号任务。我还有一个符号服务器(文件共享)。当尝试使用生成的 NuGet 包时,Visual Studio 不会尝试在符号服务器上查找 .pdb,也不会尝试下载正确的源文件。
我用动态库尝试了这个,一切正常。
使用静态库创建的 PDB 并不适合调试器直接使用,它们只能由链接器使用。并且链接器无法在符号服务器上找到 PDB。
链接器查找 .pdb 文件的唯一方法是使用有关 .pdb 的完整路径的信息,该信息被放置到链接到静态库的目标文件中。然后,它尝试在该位置准确地查找 .pdb 文件,作为后备,它还会在链接的对象文件的位置中查找具有相同名称的文件。
当它在两个位置中的任何一个位置都找不到此 .pdb 文件时,它不会将其合并到链接器尝试为当前构建步骤生成的结果 .pdb 中。如果此构建步骤适用于链接静态库的 .exe 项目,则意味着调试器可以使用的该 .exe 的 .pdb 不包含该库的任何调试信息。结果是,当您调试 .exe 时,您无法单步执行 lib 代码。
您还可以使用 /Zi(程序数据库)编译器选项将调试信息存储在 OBJ 文件的 PDB 中。链接器首先在 OBJ 文件中写入的绝对路径中查找对象的 PDB,然后在包含 OBJ 文件的目录中查找。您无法向链接器指定对象的 PDB 文件名或位置。
如果您从使用 /Zi 编译的对象创建库,则当库链接到程序时,关联的 PDB 文件必须可用。这意味着,如果您分发该库,则还必须分发 PDB 文件。要创建包含调试信息而不使用 PDB 文件的库,必须选择 /Z7 选项。如果您使用预编译头选项,则预编译头和其余源代码的调试信息都将放置在 PDB 文件中。