Проблемы компиляции MSBuild с выполнением cvtres.exe (ошибка LNK1158 - невозможно выполнить cvtres.exe) - PullRequest
0 голосов
/ 04 апреля 2019

Я устанавливаю на свой компьютер с Windows 10 (это компьютер x64) старый VS2013 Professional / VS2015 Professional.У меня есть решение / проект Visual C ++ для собственной платформы x86, и я пытаюсь скомпилировать его с помощью MSBuild.

Прежде всего: какой MSBuild выбрать?

Я попытался выбратьодин из раздела реестра: HKLM \ SOFTWARE \ Microsoft \ MSBuild \ ToolsVersions \ 4.0

Но, возможно, это не те инструменты (на этом сайте есть указание на это), потому что он указывает на: C: \ Windows\ Microsoft.NET \ Framework64 \ v4.0.30319 \

Это инструмент Msbuild для проектов на C # / Vb.net, а не для собственной платформы x86.Возможно, недавнее изменение в обновлении Windows по этому поводу изменило значение реестра.Затем я попытался изменить его на: VS 2013: C: \ Program Files (x86) \ MSBuild \ 12.0 \ Bin \

VS 2015: C: \ Program Files (x86) \ MSBuild \ 14.0 \ Bin \

Затем я установил для среды:

VS 2013: VCTargetPath = c: \ Program Files (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 \ V120

VS 2015: VCTargetPath = c: \ Program Files (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 \ V140

Я открываю «собственную командную строку x86» (с «Запуск от имени администратора») из VS2013/ 2015, а затем я запускаю следующее:

VS2013:

set VCTargetPath = \ MSBuild.exe project.vcxproj / nologo / p: PlatformToolset = v120; Конфигурация = Отладка / v: подробно

VS2015:

set VCTargetPath = \ MSBuild.exe project.vcxproj / nologo / p: PlatformToolset = v140; Конфигурация = Отладка / v: подробный

Я всегда получаю ошибку: LNK 1158 - невозможно запустить \ cvtres.exe

Файл проекта project.vcxproj правильно указывает Platform = Win32 и PlatformToolset (один из приведенных выше, характерных для VS 2013/2015).Путь к файлу cvtres.exe кажется правильным: с помощью утилиты sysInternals ProcessMonitor я вижу, что файл cvtres.exe правильно найден.Но при выполнении с msbuild он сначала загружает копию cvtres.exe, которая находится в каталоге: C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \

, а затем пытается загрузить и выполнитьодин в:

VS 2013: C: / Program Files (x86) / Microsoft Visual Studio 12.0 / VC / BIN / cvtres.exe

VS 2015: C: / Program Files (x86)/ Microsoft Visual Studio 12.0 / VC / BIN / cvtres.exe

Корректно выполняется даже выполнение команды link из цепочки MSBuild, которая загружает только определенный файл cvtres.exe (не копию).

Возможно, что-то непоследовательное в цепочке инструментов msbuild или в какой-то ИТ-политике в моем домене ПК, которая блокирует выполнение cvtres.exe при передаче через копию в: C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \

Есть ли у вас какие-либо предложения о том, как найти проблему?

1 Ответ

0 голосов
/ 05 апреля 2019

Прежде всего: какой MSBuild выбрать?

Это зависит. Если родной проект X86 имеет более раннюю версию, чем VS2013 и VS2015, то вы можете использовать оба этих инструмента в C:\Program Files (x86)\MSBuild\14.0\Bin\ и C:\Program Files (x86)\MSBuild\12.0\Bin\.

.

В любом случае, я предлагаю вам использовать командную строку разработчика для vs для запуска команды msbuild.

Откройте командную строку, введите «где msbuild», и вы обнаружите два пути msbuild. Я считаю, что командная строка будет вызывать msbuild в C:\Program Files (x86)\MSBuild\vs-version\Bin\ в большинстве случаев (но я не могу быть уверен, что это не так). при некоторых обстоятельствах вызывайте msbuild под Framework64\v4.0.30319\.

Таким образом, использование командной строки является наиболее подходящим способом, поскольку она вызовет для нас соответствующий инструмент msbuild.

Затем я установил среду:

Вы имеете в виду, что вы установили переменную среды Windows? Пожалуйста, избегайте таких действий. Установка переменных среды может испортить настройки, и иногда переменные могут быть перезаписаны свойствами проекта. Вместо этого вы можете установить переменную в файле проекта, и я думаю, что лучше установить ее в командной строке.

Вы можете найти некоторую информацию здесь . Свойства имеют свою сферу применения. А свойство в команде msbuild имеет наивысший приоритет, который перезаписывает значение, определенное в любом другом месте.

Например: как то, что вы используете в конфигурации, используйте команду как: msbuild xxx.vcxproj /p:Configuration=Debug;VCTargetsPath=C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140 ...

Одна команда для одной сборки, не разделяйте команду на две части: одну для заданных значений и другую для сборки.

И затем он пытается загрузить и выполнить один из: v12.0 ...

Я думаю, это потому, что вы не установили правильный VCTargetsPath, используемый вами VCTargetPath не распознается механизмом msbuild, поэтому он не работает. И, обратившись к описанной выше проблеме от Apparao, вы обнаружите, что PlatFormToolset property не может работать с не установленным VCTargetsPath.

Таким образом, вы можете попробовать открыть командную строку разработчика от имени администратора, а затем использовать такую ​​команду:

msbuild xxx\xxx\xxx.vcxproj /nologo /p:Platform=Win32;Configuration=Debug;VCTargetsPath="xxx\xxx" /v:detailed

Надеюсь, это поможет. И любое обновление или другое сообщение об ошибке вы можете обновить его в своем вопросе, если оно не устранено.

...