静态 C++ 库的源索引

问题描述 投票:0回答:1

我正在尝试从静态 C++ 库创建 NuGet 包。我在本地 Azure DevOps 服务器中有一个构建管道,并且尝试使用针对构建时生成的 .pdb 的发布符号任务。我还有一个符号服务器(文件共享)。当尝试使用生成的 NuGet 包时,Visual Studio 不会尝试在符号服务器上查找 .pdb,也不会尝试下载正确的源文件。

我用动态库尝试了这个,一切正常。

c++ version-control azure-devops nuget lib
1个回答
0
投票

使用静态库创建的 PDB 并不适合调试器直接使用,它们只能由链接器使用。并且链接器无法在符号服务器上找到 PDB。

链接器查找 .pdb 文件的唯一方法是使用有关 .pdb 的完整路径的信息,该信息被放置到链接到静态库的目标文件中。然后,它尝试在该位置准确地查找 .pdb 文件,作为后备,它还会在链接的对象文件的位置中查找具有相同名称的文件。

当它在两个位置中的任何一个位置都找不到此 .pdb 文件时,它不会将其合并到链接器尝试为当前构建步骤生成的结果 .pdb 中。如果此构建步骤适用于链接静态库的 .exe 项目,则意味着调试器可以使用的该 .exe 的 .pdb 不包含该库的任何调试信息。结果是,当您调试 .exe 时,您无法单步执行 lib 代码。

/DEBUG(生成调试信息)

您还可以使用 /Zi(程序数据库)编译器选项将调试信息存储在 OBJ 文件的 PDB 中。链接器首先在 OBJ 文件中写入的绝对路径中查找对象的 PDB,然后在包含 OBJ 文件的目录中查找。您无法向链接器指定对象的 PDB 文件名或位置。

/Z7、/Zi、/ZI(调试信息格式)

如果您从使用 /Zi 编译的对象创建库,则当库链接到程序时,关联的 PDB 文件必须可用。这意味着,如果您分发该库,则还必须分发 PDB 文件。要创建包含调试信息而不使用 PDB 文件的库,必须选择 /Z7 选项。如果您使用预编译头选项,则预编译头和其余源代码的调试信息都将放置在 PDB 文件中。

© www.soinside.com 2019 - 2024. All rights reserved.