为什么在相同的 Visual Studio 解决方案中生成时 C++ 调试符号不匹配?

Why are C++ debug symbols mismatched when generated in the same Visual Studio solution?

我的 Visual Studio 2019 项目配置有问题,我 运行 没有想法可以检查。我有 3 个本机 C++ 共享库(A、B、C),它们全部按顺序堆叠在一起。 B 依赖于 A。C 依赖于 B。然后我 link 所有 3 到一个可执行文件。所以最终的堆栈看起来像 A->B->C->Executable。所有库和可执行文件都位于同一个 Visual Studio 解决方案中。所有的代码都是我的。解决方案文件由CMake生成。

我可以设置断点并调试 A、B 和可执行文件。我无法进入库 C,因为符号文件不会加载。模块 window 显示“无法找到或打开 PDB 文件”。搜索路径确实包括项目输出文件夹。当我手动尝试加载自动生成的 library_c.pdb 文件时,我看到一个弹出错误,指出“在此文件夹中找不到匹配的符号文件。”

我试过删除所有内容并从头开始重新创建环境。我比较了库 C 和其他可调试库之间的所有项目设置,但没有发现明显的差异。我的互联网搜索都说如何手动加载符号或指示错误是因为符号不匹配。我还没有发现任何暗示自动生成的 pdb 在构建时如何或为什么不匹配相应的 lib 或 dll 的信息。

鉴于这种情况,您接下来会调查什么?什么会导致生成的符号文件不匹配?

编辑:drescherjm 建议我仔细检查时间戳。 Windows Explorer 将“修改日期”列为相同的。但是,如果我右键单击每个文件并打开属性,我会发现一个有趣的异常。良好工作文件的“已创建”时间戳都有日期和时间 (HH:MM:SS)。错误的 library_c.pdb 列出了没有时间戳的日期。它不是时间戳,而是“XX 分钟前”。我不确定这意味着什么,但它是不同的。

库 C 的 CMake 文件(此处称为 foo_client)包含此代码段。

add_library(foo::foo_client ALIAS foo_client)
set_target_properties(foo_client PROPERTIES EXPORT_NAME client)

可执行文件在 CMake 中的目标名称是 foo_client_exec。由于我不知道的原因,这会触发损坏的 foo_client.pdb 文件。通过使用 dbh,我转储了 .pdb 文件中引用的所有源文件 (dbh foo_client.pdb src),并确认该列表缺少 foo_client 库中的所有内容。但是,它以某种方式引用了可执行文件中的文件。让我重复那个奇怪的地方来强调它。可执行文件的文件以某种方式在库的 .pdb.foo_client.pdb 中被引用。我不知道如何将二进制文件链从可执行文件向后传播回库。

如果我将可执行文件重命名为不以“foo_client”作为前缀开头的任何内容,则 .pdb 文件会正确生成并且仅引用 foo_client 文件。 Visual Studio 2019 and/or CMake 3.15 似乎在进行某种命名模式匹配,导致可执行文件的源文件替换生成的 .pdb.[=25= 中的库文件]

尽管 .pdb 文件已损坏,但库在链接到任何可执行文件时执行没有问题。无论问题的根本原因是什么,它似乎都与 .pdb 文件的生成有关。据我所知,其他一切正常。