Невозможно скомпилировать с 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 ++ Directory определяют, какой компилятор и компоновщик используются. На этом этапе используется кросс-компилятор, находящийся в каталоге $ (VCInstallDir) bin \ x86_amd64 . Кроме того, все остальные каталоги, похоже, указывают на x64-версии всех библиотек и так далее.

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

Итак, я проверил это, и действительно, в $ (VCInstallDir) bin \ x86_amd64 нет версии cvtres.exe (хотя есть его версии в базовом каталоге ( $ (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] (скрыто) Неверный дескриптор.

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

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

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

Итак, какие-нибудь предложения?

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

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

  • $ (VCInstallDir) bin \ x86_amd64
  • $ (SourceFileDir)
  • C: \ Windows \ System32 \ NV

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

Update2 : Чтобы вывести дополнительную информацию, я решил скопировать 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), поэтому теперь я действительно начинаю думать, что что-то действительно не так с моей установкой здесь.

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

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

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

9
задан Wim.van.Gool 29 February 2012 в 08:52
поделиться