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

Как разработчик 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-разрядные версии всех библиотек и так далее.

Когда вы решите эту проблему в Google, вы обнаружите, что используемый компоновщик (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), о которой я говорил. Я пробовал это, но не решает проблему. Мне интересно, что происходит в фоновом режиме, когда запускается VS Build, о котором я, кажется, не знаю...

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

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

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

Обновление 2: просто чтобы добавить дополнительную информацию, я решил скопировать файл cvtres.exe из каталога $ (VCInstallDir) в каталог $(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 найден и выполняет большой объем работы - до конца, как кажется, но я не совсем уверен в этом. В любом случае, ошибка все еще не позволяет мне выполнить созданный исполняемый файл, так как он жалуется, что определенная библиотека не была найдена. Вероятно, это связано с тем, что компоновщик не завершил работу корректно, поэтому, в общем, он не решает мою проблему здесь.

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

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

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

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

6 ответов

Решение

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

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

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

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

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

> powershell

в Power Shell введите:

> echo ${Env:PATH}

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

C:\Windows\system32\NV;.;

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

Я только что выяснил один (из 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\"

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

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

ура

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

Я должен был получить исключение как

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

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

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

Другие вопросы по тегам