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

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

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

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

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

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

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

этот последний момент кажется решающим, так как настройки каталога VC++ определяют, какой компилятор и компоновщик используются. На данный момент кросс-компилятор, находящийся в $(VCInstallDir)binx86_amd64-каталог. Кроме того, все остальные каталоги, похоже, указывают на x64 версии всех библиотек и так далее.

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

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

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

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

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

когда я копирую cvtres.exe из $(VCInstallDir)bin или $(VCInstallDir)binamd64 to $(VCInstallDir)binx86_amd64 и компилировать, я либо получаю то же сообщение (Теперь ссылаясь на точное местоположение: не удается запустить $(VCInstallDir)binx86_amd64cvtres.exe', хотя он есть) или компоновщик выходит с каким-то неизвестным кодом ошибки (возможно, потому, что версия $(VCInstallDir)binamd64 является родным x64 в отличие от кросс-компилятора x86, который, как я узнал, работает в режиме WoW64).

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

-- попытка #02-обойти проблему, пытаясь другой подход -

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

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

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

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

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

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

поэтому, пожалуйста, любые предложения?

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

@Hans Passant: Thnx для наконечника! Process Monitor показывает мне эту ссылку.exe пытается найти cvtres.exe на одном из следующих местоположений:

  • $(VCInstallDir)binx86_amd64
  • $(SourceFileDir)
  • C:WindowsSystem32NV

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

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

файлы C:Program (для x86)MSBuild вМайкрософт.Cppv4.0платформыx64Microsoft.СРР.х64.Цели (389,5): ошибка MSB6006: "ссылка.exe " вышел с кодом -1073741515. (строка здесь просто относится к настройкам, которые проверяют какие ненулевые коды выхода приемлемы-фактический код ошибки был возвращен по ссылке.исполняемый.)

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

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

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

вместо этого, я сделал некоторые исследования на код ошибки, и я думаю, что это имеет какое-то отношение к тому, что ссылка.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) решение (проекты связаны в последовательной линейной цепочке зависимостей), имело a .rc-файл в пустых файлах проекта. Удаление пустого .rc-файл (из проекта, не удаляя его) решил " фатальную ошибку LNK1158: ... cvtres.проблема ехе".

Update: скопируйте рабочую версию 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\"

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

Microsoft.СРР.х64.Цели (152,5): ошибка MSB6006: "CL.exe " вышел с кодом 1.

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

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


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


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

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

Ура