使用 MSVC 编译时 msdpb* 文件的正确用法是啥

Posted

技术标签:

【中文标题】使用 MSVC 编译时 msdpb* 文件的正确用法是啥【英文标题】:What is the proper usage of msdpb* files when compiling with MSVC使用 MSVC 编译时 msdpb* 文件的正确用法是什么 【发布时间】:2019-10-21 11:58:35 【问题描述】:

网上有很多关于“缺少mspdb140.dll”的问题,还有其他关于缺少“mspdb*”DLL 的类似问题。发布了一些不同的解决方案,包括:

重新安装 Visual Studio 删除 mspdb140.dll,它应该包含在 PATH 变量中 将 mspdb140.dll(和其他文件)添加到 <msvc-install-dir>\<subpath>

就我而言,我在 docker 容器中使用了 msvc 2019 安装程序的构建工具,然后为 msvc 2017 和 2019 安装了两个构建工具。如果我然后转到 C:\BuildTools\VC\Tools\MSVC\14.16.27023\bin\HostX64,则有两个文件夹:@987654324 @ 和 x86。如果我编写 powershell 命令ls -Recurse -Filter "*mspdb*",我会得到以下输出:

Directory: C:\BuildTools\VC\Tools\MSVC\14.16.27023\bin\HostX64\x64
  mspdb140.dll
  mspdbcmf.exe
  mspdbcore.dll
  mspdbsrv.exe
  mspdbst.dll

Directory: C:\BuildTools\VC\Tools\MSVC\14.16.27023\bin\HostX64\x64\1033
  mspdbcmfui.dll

HostX64\x86 目录中没有这些文件。如果我以 x64 作为目标构建一切正常,但以 x86 作为目标,发布和调试构建都会出错。发布版本有:

ERROR: C:\BuildTools\VC\Tools\MSVC\14.16.27023\bin\HostX64\x86\cl.exe
...
c1xx: fatal error C1356: unable to find mspdbcore.dll

调试版本有:

ERROR: C:\BuildTools\VC\Tools\MSVC\14.16.27023\bin\HostX64\x86\cl.exe
...
c1xx: fatal error C1356: unable to find mspdb140.dll

这些构建使用 Qt 和 Qbs,Qbs 使用 vcvarsall.bat 来查找所需的环境变量。当安装了多个 msvc 工具链时,Qbs 中存在一个错误,这使得 Qbs 总是选择最新的。为了解决这个问题,我手动移动了 vcvarsall.bat 并在每个构建作业中将其替换为:

call %~dp0vcvarsall_real.bat %1 store 10.0.17134.0 -vcvars_ver=14.16.27023 || exit /b 1

这会强制 vcvarsall 选择我想要的工具链 14.16.27023。

我通过简单地复制存在于 x64 目标的 DLL 和 EXE 文件(mspdbcmfui.dll 除外)来修复这两个编译错误。没有理由不复制最后一个 DLL,因为我只是在试验。即使程序编译了,我也不知道我在做什么,这些文件在哪里使用,或者为什么某些目标缺少它们!不必在我的构建环境中手动复制文件会感觉更好。

我还检查了我本地安装的 Visual Studio 2017 Professional,然后我有相同名称的 HostX64\x64 文件,但对于 HostX64\x86,我得到以下输出:

C:\Program Files (x86)\Microsoft Visual Studio\2017\WDProfesional\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x86
...
mspdb140.dll
mspdbcore.dll

只有两个 DLL!

在 docker 镜像中,我还有 MSVC 2019 的构建工具,所有主机和目标组合都有所有 DLL 和 EXE。

总结一下:

为什么在某些情况下会丢失 DLL 解决此问题的正确方法是什么? Visual Studio 编译与使用 vcvarsall.bat 和外部工具有何不同,因为它显然能够在不复制 DLL/EXE 的情况下进行编译!

【问题讨论】:

可能相关:developercommunity.visualstudio.com/content/problem/325122/… 谢谢,看起来他们可能已经修好了。我检查了我的 Visual Studio 2017 版本,我正在运行 15.9.13。在您发布的链接中,他们说这应该已在 15.8 版中修复。要么是我的安装有问题,要么没有正确修复。 【参考方案1】:

我仍然希望有人能详细说明这些文件存在的原因、如何正确使用它们、为什么它们在某些地方丢失,以及 Visual Studio 似乎即使在丢失文件的情况下也能够编译。与此同时,我发现了这个:

我已经安装了 MSVC 2019 的构建工具,所以我去了文件夹 C:\BuildTools\VC\Tools\MSVC\14.22.27905\bin\Hostx64 并运行了以下 powershell 命令:

(ls -Recurse "mspdb*").FullName | %  Get-FileHash $_  | Sort-Object -Property Hash

得到了这个输出:

Hash                                                                   Path
--------------------------------------------------------------------------------------------------------------------------------------------
658D21DF98781D7C137FA213C3F3C2222C5D20A0F75BEB4929703406241379FA       C:\BuildTools\VC\Tools\MSVC\14.22.27905\bin\Hostx64\x86\mspdbcmf.exe
658D21DF98781D7C137FA213C3F3C2222C5D20A0F75BEB4929703406241379FA       C:\BuildTools\VC\Tools\MSVC\14.22.27905\bin\Hostx64\x64\mspdbcmf.exe
9664EE9A457B444E0D5A2F6A73A896375966BCF3864BBCD6B76AFEF496EC954C       C:\BuildTools\VC\Tools\MSVC\14.22.27905\bin\Hostx64\x64\mspdbcore.dll
9664EE9A457B444E0D5A2F6A73A896375966BCF3864BBCD6B76AFEF496EC954C       C:\BuildTools\VC\Tools\MSVC\14.22.27905\bin\Hostx64\x86\mspdbcore.dll
A056C5CC109CB6BFABBA3982E5739B57C2C6AEBEBDF41FB6DD17586ED4FA7F13       C:\BuildTools\VC\Tools\MSVC\14.22.27905\bin\Hostx64\x86\mspdbsrv.exe
A056C5CC109CB6BFABBA3982E5739B57C2C6AEBEBDF41FB6DD17586ED4FA7F13       C:\BuildTools\VC\Tools\MSVC\14.22.27905\bin\Hostx64\x64\mspdbsrv.exe
C48FC0A0BE36C70974CD180DD0DB22BB1EA84585BBE0B23583C6FEDCAEA0C76F       C:\BuildTools\VC\Tools\MSVC\14.22.27905\bin\Hostx64\x86\1033\mspdbcmfui.dll
C48FC0A0BE36C70974CD180DD0DB22BB1EA84585BBE0B23583C6FEDCAEA0C76F       C:\BuildTools\VC\Tools\MSVC\14.22.27905\bin\Hostx64\x64\1033\mspdbcmfui.dll
E6F6DF7DAD04699078D14D02BA57A19E332367507B860E03356AF2EEA86C3D68       C:\BuildTools\VC\Tools\MSVC\14.22.27905\bin\Hostx64\x64\mspdb140.dll
E6F6DF7DAD04699078D14D02BA57A19E332367507B860E03356AF2EEA86C3D68       C:\BuildTools\VC\Tools\MSVC\14.22.27905\bin\Hostx64\x86\mspdb140.dll
ECC40C0574AC6B93E3ACFC3EB95882D5391A2AC10E9ACC4444D418E5D5014135       C:\BuildTools\VC\Tools\MSVC\14.22.27905\bin\Hostx64\x86\mspdbst.dll
ECC40C0574AC6B93E3ACFC3EB95882D5391A2AC10E9ACC4444D418E5D5014135       C:\BuildTools\VC\Tools\MSVC\14.22.27905\bin\Hostx64\x64\mspdbst.dll

所有以mspdb 开头的文件在x86x64 之间作为目标文件完全相同。如果我在Hostx86 文件夹中尝试相同,目标之间的文件也完全相同,但与其他主机相比有所不同。

我认为对于 MSVC 2017 的同一主机的不同目标重复使用这些文件应该是安全的。我的复制这些文件后编译成功了,不能完全错!

【讨论】:

以上是关于使用 MSVC 编译时 msdpb* 文件的正确用法是啥的主要内容,如果未能解决你的问题,请参考以下文章

如何验证编译时在 msvc 2010 c++ 项目中是不是正确设置了编译器选项?

如何在 MSVC 中使用使用 MingW 编译的库?

dll 运行时错误(C/C++/GCC/MSVC)

Qt使用MSVC编译器中文乱码解决方法

选择 MSVC 工具链

vs 编译库文件 Qt编译库文件