网上有很多关于“缺少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
,有两个文件夹:x64
和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 的情况下进行编译!