Как разработчик 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 и все такое ...
Спасибо за предложения в любом случае!