Как правильно использовать файлы msdpb * при компиляции с MSVC? - PullRequest
0 голосов
/ 21 октября 2019

В Интернете существует много вопросов о "отсутствующих 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!

1 Ответ

0 голосов
/ 22 октября 2019

Я все еще надеюсь, что кто-то может объяснить больше о том, почему эти файлы существуют, как их правильно использовать, почему они отсутствуют в некоторых местах, и как 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, в точности совпадают между x86 и x64 в качестве цели. Если я попытаюсь сделать то же самое в папке Hostx86, файлы также будут одинаковыми между целями, но будут отличаться от других хостов.

Я думаю, что эти файлы можно безопасно использовать повторнодля разных целей для одного хоста на MSVC 2017. Моя компиляция завершается успешно после копирования этих файлов, поэтому она не может быть полностью неправильной!

...