Невозможно скомпилировать с VC ++ / VS2010 для x64: LNK1158: невозможно запустить cvtres.exe - PullRequest
9 голосов
/ 28 февраля 2012

Как разработчик C #, я недавно решил попробовать свои программы на C ++, главным образом потому, что нашел интересный API C ++, с которым мне хотелось поиграть. Я написал очень простую программу несколько дней назад, скомпилировал ее на целевой платформе x64, запустил, и все было просто замечательно.

Однако вчера я изменил часть кода, попытался скомпилировать его, но затем компоновщик начал жаловаться:

LNK1158: не удается запустить 'cvtres.exe'

Поскольку я довольно новичок в разработке программ на C ++, я подумал, что, должно быть, сделал какую-то ошибку новичка. Тем не менее, после проверки всей конфигурации, поиска в Google в течение нескольких часов и попытки нескольких «исправлений», я начинаю думать, что эта проблема может быть вызвана чем-то более делегатским, и суть в том, что я не могу решить проблему вообще Так что я надеялся получить здесь хороший отзыв.

Прежде всего, позвольте мне перечислить мою конфигурацию:

  • Я использую Windows 7 (x64) и использую VS2010 Premium.
  • Я создал стандартное и пустое консольное приложение Win32, в котором содержится только один .cpp-файл, содержащий основную функцию. Это не программа Hello World, но не за горами.
  • Поскольку у меня платформа x64, я также использую конфигурацию целевой платформы x64. Я создал эту конфигурацию без копирования каких-либо настроек из конфигурации Win32.
  • В Свойствах проекта -> Каталоги VC ++ я оставил все каталоги по умолчанию (хотя я несколько раз менял их, чтобы попытаться решить проблему, но безуспешно, поэтому я вернулся к значениям по умолчанию).

Этот последний пункт представляется крайне важным, поскольку параметры каталога VC ++ определяют, какой компилятор и компоновщик используются. На этом этапе используется кросс-компилятор, находящийся в каталоге $ (VCInstallDir) bin \ x86_amd64 . Более того, все остальные каталоги указывают на версии 64-битных библиотек и т. Д.

Когда вы погуглите эту проблему, вы обнаружите, что используемый компоновщик (link.exe) хочет выполнить cvtres.exe, который он не может найти. Эта проблема возникает, когда cvtres.exe не находится ни в одном каталоге с компоновщиком, ни в каталоге, который разрешается с помощью переменной PATH.

Итак, я проверил это, и на самом деле нет версии cvtres.exe в $ (VCInstallDir) bin \ x86_amd64 (хотя есть версии в базовой директории ( $ (VCInstallDir) ) bin ) и в «чистом» каталоге $ (VCInstallDir) bin \ amd64 ), а также переменная PATH не содержит никакого списка каталога, содержащего версию cvtres.exe.

- Попытка # 01 - Исправить проблему под рукой -

В результате вы можете заключить, что ошибка фактически является юридической ошибкой, и я должен исправить это, либо скопировав версию cvtres.exe непосредственно в $ (VCInstallDir) bin \ x86_amd64 или отредактируйте переменную PATH так, чтобы она указывала на ее полезную версию.

К сожалению, ничего из этого не работает.

Когда я копирую cvtres.exe из $ (VCInstallDir) bin или $ (VCInstallDir) bin \ amd64 в $ (VCInstallDir) bin \ x86_amd64 и при компиляции я либо получаю то же сообщение (теперь ссылающееся на точное местоположение: «невозможно запустить $ (VCInstallDir) bin \ x86_amd64 \ cvtres.exe ', хотя оно есть) или компоновщик завершает работу с неизвестным код ошибки (возможно, потому что версия $ (VCInstallDir) bin \ amd64 является родной x64 в отличие от кросс-компилятора x86, который, как я обнаружил, работает в режиме WoW64).

Проблема с попыткой отредактировать переменную PATH таким образом, чтобы компоновщик мог найти версию cvtres.exe, также завершается сбоем, поскольку я не знаю, с каким путем ссылаться (кажется, что сохранилось еще много версий cvtres.exe). в разных местах, например в каталоге .NET 4.0 SDK).

- Попытка № 02 - Обойти проблему, попробовав другой подход -

Другой путь, который я выбрал, - это попытаться использовать компилятор и компоновщик в $ (VCInstallDir) bin \ amd64 вместо кросс-компилятора. В конце концов, я использую 64-битную машину, поэтому мне не нужно использовать кросс-компилятор, хотя Microsoft, похоже, выбирает этот по умолчанию, независимо от вашей локальной конфигурации / ОС.

Поэтому я изменил каталог VC ++, чтобы он указывал на это местоположение, и проблема действительно больше не возникает, но теперь у меня возникла проблема с трекером при запуске CL.exe:

TRK0002: [CL.exe] '@ [TempFile] .rsp': недопустимый дескриптор.

Когда я ищу этот временный файл, я не могу его найти, но я не уверен, был ли он сразу удален после завершения компиляции или его вообще не было. К сожалению, поиск этой проблемы также является тупиком, и команда MS Visual Studio 2010 даже распознает эту проблему, но поставила ее на «Не исправит» . Короче говоря, исходная 64-битная компиляция кажется известной общей проблемой с VS2010, поэтому я решил вернуться к первому вопросу об этом, тем более что другие люди, имеющие эту проблему, всегда говорят: «Вы можете решить эту проблему, просто использование кросс-компилятора вместо собственного компилятора x64 '.

ОК, так что теперь у меня заканчиваются варианты ... И сумасшедшая вещь в том, что все это работало хорошо всего несколько дней назад, и я почти уверен, что ничего не изменил и не установил в отношении этого проекта, ни обновил Visual Studio или .NET Framework как-то. Я даже проверил Windows Update, но не могу найти какие-либо связанные обновления за последние несколько дней.

Единственное, что я мог сделать, в крайнем случае, - это понизить все это до 32-битной и загрузить 32-битную версию API, но я бы очень хотел этого избежать, потому что кажется для меня я должен иметь возможность компилировать и запускать 64-битные приложения на моем 64-битном ноутбуке / ОС.

Так что, пожалуйста, какие-либо предложения?

Обновление : Согласно этой инструкции от MS переменная PATH для компоновщика должна указывать на базовый каталог установки VC ++. Это $ (VCInstallDir) bin , о котором я говорил. Я пробовал это, но не решает проблему. Мне интересно, что происходит в фоновом режиме, когда запускается VS Build, о котором я, кажется, не знаю ...

@ Ганс Пассант: Спасибо за подсказку! Монитор процессов показывает, что link.exe пытается найти cvtres.exe в одном из следующих мест:

  • $ (VCInstallDir) бен \ x86_amd64
  • $ (SourceFileDir)
  • C: \ Windows \ System32 \ NV

Само собой разумеется, cvtres.exe не существует ни в одном из этих каталогов. Довольно странно, что только в этих местах ищутся. Я бы, по крайней мере, ожидал, что $ (VCInstallDir) bin был найден, поскольку этот каталог явно указан как в каталогах VC ++, так и в переменной PATH (которую я для этого отредактировал вручную). Я предполагаю, что это сводится к выяснению, почему это поведение такое, как есть ....

Обновление2 : просто чтобы добавить дополнительную информацию, я решил скопировать файл cvtres.exe из $ (VCInstallDir) bin в $ (VCInstallDir) bin \ каталог x86_amd64 , основанный на моих выводах с использованием ProcMon, просто чтобы посмотреть, что происходило тогда. Прежде всего, как и прежде, Visual Studio сообщает мне следующее:

C: \ Program Files (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 \ Platforms \ x64 \ Microsoft.Cpp.x64.Targets (389,5): ошибка MSB6006: «link.exe» выход с кодом -1073741515. (строка здесь просто относится к настройке, которая проверяет, допустимы ли ненулевые коды выхода - фактический код ошибки был возвращен link.exe.)

Тем не менее, в окне вывода ProcMon я вижу, что cvtres.exe найден и выполняет большой объем работы - до конца, как кажется, но я не совсем уверен в этом. В любом случае, ошибка все еще не позволяет мне выполнить созданный исполняемый файл, так как он жалуется, что определенная библиотека не была найдена. Вероятно, это связано с тем, что компоновщик не завершил работу корректно, поэтому, короче говоря, он не решает мою проблему здесь.

Update3 : Еще одна «интересная» вещь, которую я попробовал, состояла в том, чтобы просто создать новый простой Win32-проект со всеми настройками MS по умолчанию, и я даже не трогал код, сгенерированный для меня (основная функция сразу же), чтобы увидеть хотя бы одну программу компиляции. Удивительно, но теперь я получаю ту же ошибку, что и выше (файл link.exe завершен с кодом -1073741515), так что теперь я действительно начинаю думать, что что-то не так с моей установкой здесь.

Итак, я попытался удалить и переустановить части Visual Studio для VC ++, но безрезультатно ... На данный момент полная установка Visual Studio невозможна, так как я все еще нахожусь в процессе разработки C # проекты, и у меня есть тонны других установленных надстроек, которые в настоящее время занимают слишком много моего времени, чтобы переустановить и перенастроить. Я мог бы попробовать это в выходные, если до этого ничего не получалось.

Вместо этого я провел некоторое исследование кода ошибки, и я думаю, что это как-то связано с тем, что link.exe не может найти или получить доступ к требуемой зависимости. Я уже выключил свой VirusScanner, чтобы быть в безопасности (не помогает), поэтому сейчас я загружаю последнюю версию Windows SDK (7.1), чтобы проверить, что это будет. Если это не поможет, я думаю, это либо ужасная ошибка, либо моя установка действительно где-то испорчена, и мне, возможно, придется переустановить VS и все такое ...

Спасибо за предложения в любом случае!

Ответы [ 6 ]

6 голосов
/ 29 февраля 2012

Путь C:\Windows\System32\NV может указывать на проблему, которая обсуждается здесь и здесь .

Похоже, что некоторые драйверы NVIDIA, которые могут переключать графические режимы (встроенные / дискретные), могут в некоторых ситуациях повреждать системный путь (например, с помощью беспроводных путей Intel на системном пути).

Отключение службы NV Services может решить вашу проблему.

4 голосов
/ 15 июня 2012

Один из простых способов воспроизвести эту ошибку заключается в следующем:

Открыть командную строку (cmd.exe), введите:

> powershell

в Power Shell, тип:

> echo ${Env:PATH}

Если вывод выглядит следующим образом:

C:\Windows\system32\NV;.;

тогда у вас есть эта ошибка.

1 голос
/ 01 июня 2015

Я только что выяснил один (из 3 в общей сложности) проектов в моем решении VS2010 (SDK7.1) (проекты связаны в последовательной цепочке линейных зависимостей), в файлах проекта был файл .rc, который был пуст , Удаление пустого файла .rc (из проекта, не удаляя его) решило проблему «фатальная ошибка LNK1158: ... cvtres.exe».

Обновление: скопируйте рабочую версию cvtres.exe в нужное место, чтобы MSBuild могла подобрать ее:

xcopy "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cvtres.exe" "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\x86_amd64\"
0 голосов
/ 27 января 2015

У меня была такая же проблема при запуске VS6 на VMWare 11 (Win XP 32).

Мне пришлось отключить службу .NET от 'msconfig -> services'

Cheers

0 голосов
/ 15 января 2013

Я работал на 4200-метровой карте Nvidia, и это изменило мой путь. Отключение сервисов NV не помогло. Затем я установил новый драйвер 310.90 с сайта Nvidia, и он исправил эту проблему. Обратите внимание, что когда я установил драйвер, я установил флажок «Выполнить чистую установку».

0 голосов
/ 20 ноября 2012

Я получаю исключение как

Microsoft.Cpp.x64.Targets (152,5): ошибка MSB6006: «CL.exe» завершен с кодом 1.

, так как я использовал проект MFC, затем преобразовал его в проект CLR / CLI и, наконец, обнаружил, что причиной стал файл targetver.h.

после того, как я его удалю, проект строится хорошо.Кроме того, проект хорошо собран под Release / Debug / Win32 и Debug / x64, только проблема с выпуском x64 имеет эту проблему.

...