В Интернете существует много вопросов о "отсутствующих mspdb140.dll" и других подобных вопросах об отсутствующих библиотеках "mspdb *". По этому поводу опубликовано несколько различных решений, в том числе:
- переустановите Visual Studio
- Удалите mspdb140.dll, его следует включить в переменную PATH
- Добавитьmspdb140.dll (и другие файлы) в
<msvc-install-dir>\<subpath>
В моем случае я использовал инструменты сборки для установщика msvc 2019 в контейнере Docker, а затем установил оба средства сборки для 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 для поиска необходимых переменных среды. В Qbs есть ошибка при наличии нескольких установленных наборов инструментов msvc, из-за чего 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.
Мне удалось исправить обе ошибки компиляции, просто скопировав файлы DLL и EXE, которые существуют для цели x64, кроме 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!
В образе докера у меня также есть инструменты сборки для MSVC 2019, и там всеКомбинации хоста и цели содержат все библиотеки DLL и EXE.
Подводя итог:
- Почему в некоторых случаях отсутствуют библиотеки DLL
- Как правильно выбратьКак это исправить?
- Чем компиляция Visual Studio отличается от использования vcvarsall.bat и внешних инструментов, так как она может компилироваться без копирования DLL / EXE!