Не удается скомпилировать с 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"
Ура