Ошибка «ССЫЛКА: фатальная ошибка LNK1123: ошибка при преобразовании в COFF: файл неверен или поврежден» после установки Visual Studio 2012 Release Preview

535

Я установил Visual Studio 2012 Release Preview, и это выглядит нормально, но теперь, когда я пытаюсь использовать Visual Studio 2010 для компиляции проектов C ++, я получаю следующее сообщение об ошибке:

ССЫЛКА: фатальная ошибка LNK1123: ошибка при преобразовании в COFF: файл неверен или поврежден

Я не уверен на 100% в этом, но, похоже, это связано с проектами, в которых есть .rcфайлы (ресурсов).

Я пытался восстановить Visual Studio 2010 из раздела «Установка и удаление программ» и перезагрузить компьютер, но это не дает никакого эффекта.

Я также получаю ту же ошибку, если использую Visual Studio 2012 RC для компиляции проектов C ++, когда установлен набор инструментов Visual Studio 2010. Обновление до набора инструментов Visual Studio 2011 устраняет проблему (но, конечно, я не хочу делать это для производственного кода).

Обновление: я удалил Visual Studio 2012 , перезагрузился, и проблема все еще сохраняется! Помогите!

Орион Эдвардс
источник
Это проблема x86, проблема x64 или и то, и другое? Я вижу это в 32-битной операционной системе. Я не помню, чтобы видел это в 64-битной операционной системе.
jww

Ответы:

652

Этот поток MSDN объясняет, как это исправить.

Обобщить:

  • Либо отключите инкрементное связывание, перейдя в

    Project Properties 
       -> Configuration Properties 
           -> Linker (General) 
              -> Enable Incremental Linking -> "No (/INCREMENTAL:NO)"
    
  • или установите VS2010 SP1.

Изменения (@CraigRinger): обратите внимание, что установка VS 2010 SP1 удалит 64-битные компиляторы . Вам нужно установить пакет компилятора VS 2010 SP1, чтобы получить их обратно.

Это влияет Microsoft Windows SDK 7.1 для Windows 7 и .NET 4.0, а также на Visual Studio 2010 .

короткий
источник
1
Я столкнулся с этой проблемой вскоре после установки .Net 4.5. Установка VS2010 SP 1 решена. Я не устанавливал VS 2012 в любой момент.
KJAWolf
2
Чтобы отключить инкрементные ссылки с помощью CMakefile: cmake.org/pipermail/cmake/2010-
Карта X
2
В Qt под Visual Studio добавьте в свой .pro: QMAKE_LFLAGS + = / INCREMENTAL: НЕТ Работало для меня
gollumullog
5
@ Grundic Вроде. Мы переименовали cvtres.exe в Win 7 sdk, чтобы link.exe не нашел его и вместо этого использовал новый из .NET 4.5. Windows 8 SDK больше не содержит инструментов командной строки. Теперь вам нужно установить хотя бы Visual Studio 2012 Express для рабочих столов, чтобы получить инструменты командной строки приложения для рабочего стола. Решение по переименованию было признано наименее разрушительным, и его легко можно было написать по сценарию.
DuckPuppy
2
@DuckPuppy, к счастью, мы решили эту проблему, полностью удалив Microsoft .Net 4.5.1 из наших агентов сборки и заново установив .Net 4.0. И после этого мы запустили переустановку Microsoft SDK 7.0 со всеми отмеченными параметрами - это решило наши проблемы. Также после этого инцидента мы отключили автоматические обновления - на всякий случай.
Grundic
249

Если отключение инкрементного связывания не работает для вас, а отключение «Вставить манифест» также не работает, найдите в своем пути несколько версий CVTRES.exe.

Отладив с помощью опции компоновщика / VERBOSE, я обнаружил, что компоновщик записывал это сообщение об ошибке, когда он пытался вызвать cvtres, и это не удалось.

Оказалось, что у меня на пути было две версии этой утилиты. Один в C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN\cvtres.exeи один в C:\Windows\Microsoft.NET\Framework\v4.0.30319\cvtres.exe. После установки VS2012 версия cvtres.exe VS2010 больше не будет работать. Если это первый путь в вашем пути, и компоновщик решит, что ему нужно преобразовать файл .res в формат объекта COFF, ссылка не будет установлена ​​с LNK1123.

(Действительно раздражает, что сообщение об ошибке не имеет ничего общего с реальной проблемой, но это не является необычным для продукта Microsoft.)

Просто удалите / переименуйте старую версию утилиты или измените порядок расположения переменной PATH, чтобы работающая версия была первой.

Имейте в виду, что для сборок инструментов x64 вам также может понадобиться проверить, C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64где находится другая cvtres.exe.

Умереть в сенте
источник
3
Работал на меня. Спасибо за то, что включили совет о / VERBOSE, который показывает, как и почему, а не просто какую волшебную вещь сделать.
М Кац
1
Просто скопируйте новый файл в каталоге Framework поверх старого в каталоге Visual Studio.
Йохай Тиммер
Это решило и мою проблему. Я работаю на компьютере со строгим контролем учетных записей, поэтому я смог подтвердить, какой файл cvtres.exe работал первым из командной строки. Сначала побежал туда, где cvtres.exe. Затем "C: \ windows \ Microsoft.NET \ Framework \ v4.0.30319.cvtres.exe / machine: amd64 / verbose / out:" Имя из подробного вывода "/ только для чтения FileFromVerboutput.res. Один путь показал ошибку, .NET один работал
user176692
50

Проверьте версию cvtrs.exe:

dir "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cvtres.exe"

Неверная версия:
date: 03/18/2010
time: 1:16 вечера
size: 31,048 байт
name: cvtres.exe

Правильная версия::
date21.02.2011
time: 18:03
size: 31,056 байт
name: cvtres.exe

Если у вас неправильная версия, вы должны скопировать правильную версию из:

C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\cvtres.exe

и замените один здесь:

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cvtres.exe

т.е.

copy "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\cvtres.exe" "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cvtres.exe"
Sid
источник
Это может помочь другим людям с похожими проблемами. Я использую ms build, и мне пришлось скопировать эти файлы: msobj110.dll mspdb110.dll mspdbcore.dll mspdbsrv.exe из C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ Common7 \ IDE в C: \ Program Files ( x86) \ Microsoft Visual Studio 11.0 \ VC \ bin в дополнение к этому, согласно i-am-bryan.com/webs/tutorials/…
Келл,
Это сработало для меня, но мой «правильный» файл cvtres.exe был другого размера, даты и т. Д. (Все еще из VS 2012 bin, хотя)
aampere
Для меня решено переименование cvtres из .... Studio 10.0 \ VC \ bin \ amd64 \, директория. Я думаю, потому что я использую Intel, а не
AMD
46

По этой теме на форумах MSDN: проекты VS2012 RC установка Перерывы VS2010 C ++ , просто, взять cvtres.exeс VS2010 SP1

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cvtres.exe

или от VS2012

C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\cvtres.exe

и скопировать его на cvtres.exeв VS2010 RTM установки (одного без SP1 )

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cvtres.exe

Таким образом, вы будете эффективно использовать исправленную версию cvtres.exe11.0.51106.1.

Повторите те же шаги для 64-разрядной версии инструмента в C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\cvtres.exe.

Это решение является альтернативой установке SP1 для VS2010 - в некоторых случаях вы просто не можете установить SP1 (т. Е. Если вам нужно поддерживать сборки до SP1).

mloskot
источник
1
Это сработало для меня. Поскольку я использую 64-разрядную версию win7, я сначала скопировал файл cvtres.exe из папки ... Framework64 \ v4.3 ..., но это не решило проблему. Затем скопировал его из папки Framework \ v4.3 ... и это решило проблему СПАСИБО !!!!!
Сокол
36

Если вы установили Visual Studio 2012 RC, то он установил .NET 4.5 RC.

Удалите .NET 4.5 RC и установите нужную версию (4.0 для VS 2010). Это должно устранить любые проблемы, которые у вас есть.

Это решило ту же проблему. Нет необходимости удалять Visual Studio.

B_Dubb42
источник
4
Большой!! Я только заменил .NET 4.5 на .NET 4.0. и работает нормально !!
ManUtd
1
обновление: удаление .net 4.5 и 4.0 исправляет это для меня (VS 2010 express). Однако обновление Windows, кажется, постоянно обновляется до .net 4.5.1, поэтому мне приходится повторять это время от времени. Однако, установив VS 2010 SP1 и вуаля, VS 2010 Express теперь тоже работает, а .Net 4.5.1 все еще установлен.
rogerdpack
15

Это из-за .NET Framework 4.5 заменяет .NET Framework 4.0. Я удалил Visual Studio 2010 несколько раз, но не повезло. Когда я удалил .NET Framework 4.5 и переустановил Visual Studio 2010, все прошло нормально.

См. Удаление Visual Studio 11 полностью, чтобы выполнить новую установку .

AlonSamuel
источник
3
Подтвердите это !!!!!!! Просто переустановка VC2010 не помогает. После удаления framework4.5 RC все нормально.
Инкубу
Я установил umdh, который устанавливает .net 4.5, который сломал Visual Studio 2010. После удаления .net 4.5 и переустановки .net 4.0 моя Visual Studio вернулась к жизни.
Stu
14

Для меня установка «Сгенерировать манифест» на «Нет» исправила это. (Также исправлено с помощью / INCREMENTAL: NO)

FractalSpace
источник
14

Если вы используете x64, вот ресурс поможет :

Это происходит потому, что Microsoft .NET 4.5 несовместим с Visual C ++ 10. Обходной путь должен гарантировать, что вы запускаете версию .NET cvtres.exe, а не версию Visual C ++. Я сделал это, переименовав версии этих файлов для Visual C ++ и скопировав их версии .NET.

1. C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cvtres.exe
2. C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\cvtres.exe

1. C:\windows\Microsoft.NET\Framework\v4.0.30319\cvtres.exe
2. C:\windows\Microsoft.NET\Framework64\v4.0.30319\cvtres.exe
Ричард Пек
источник
1
примечание: это работает, потому что оба .NET Framework 4 Multi-targeting pack и .NET Framework 4.5.2 установлены. Файл C:\windows\Microsoft.NET\Framework\v4.0.30319\cvtres.exeпринадлежит .NET Framework 4 Multi-targeting pack. Как правило, это имеет место, если вы установили Windows SDK 7.1, а затем обновили .NET до 4.5.2. В этом случае, вы можете вообще просто переименовать C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cvtres.exeв cvtres-old.exeи новые cvtres.exe(датированный 8/30/17) будет использоваться и работать нормально.
Дэвид С. Ранкин
13

В конце концов, я решил эту проблему, выполнив полную деинсталляцию VS2012 RC, затем полную деинсталляцию VS2010, а затем переустановку с нуля VS2010.

Это заняло вечность, но теперь я могу снова скомпилировать C ++ проекты в VS2010.

Орион Эдвардс
источник
11

Проблема была волшебным образом решена для меня, удалив .NET 4.5 и заменив его на .NET 4.0 . Затем мне пришлось отремонтировать Visual Studio 2010 - он каким-то образом был поврежден.

Ранее я установил, а затем удалил Visual Studio 2012, что может быть связано с этой проблемой.

гусеница
источник
2
Это сработало для меня. Я получил Net 4.5 как важный Windows Update. Я просто удалил его, что по-новому провалило сборку. Затем я полностью восстановил установку Visual Studio 2010 Express , и это решило проблему.
Hyde
10

Я не установил Visual Studio 2012, но я все еще получал эту ошибку в Visual Studio 2010. Я получил это исправлено после установки Visual Studio 2010 SP1.

Садзи
источник
9

У меня была та же проблема с Microsoft Visual Studio 2010 Ultimate, и она была решена с помощью метода, описанного в этом видео YouTube

В видео предлагается переименовать файл cvtres.exe в C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin (in my Win7X64 matchine) в cvtres-old.exe

Сепидех Абадпур
источник
6

+1 к пользователю Короткий ответ который работал на меня!

Я попытался отладить это msbuild /v:diag, и я вижу, что MSBuild пытается встроить манифест в исполняемый файл, с <somename> .dll.embed.manifest.res в командной строке компоновщика, где это ресурс файл, созданный из <somename> .dll.embed.manifest. Но файл манифеста - это пустой текстовый файл Unicode. (То есть двухбайтовый файл с префиксом Unicode 0xFEFF)

Таким образом, похоже, что корневая проблема связана с тем, что этот файл манифеста не генерируется или используется, когда должен был использоваться <somename> .dll.intermediate.manifest.

Альтернативное решение, кажется, состоит в том, чтобы отключить опцию «Embed Manifest» в «Properties», «Manifest Tool», «Input and Output».

Умереть в сенте
источник
6

Это не сработало для меня после «Включить инкрементное связывание» -> «Нет (/ INCREMENTAL: NO)», но у меня сработало после того, как я удалил rc-файл.

robin.lo
источник
5

Обобщить:

Step1

Project Properties 
   -> Configuration Properties 
       -> Linker (General) 
          -> Enable Incremental Linking -> "No (/INCREMENTAL:NO)"

если step1 не работает, сделайте Step2

Project Properties 
   -> Configuration Properties 
       -> Manifest Tool (Input and Output) 
          -> Enable Incremental Linking -> "No"

если step2 не работает, выполните Step3. Скопируйте один из файлов:

  1. C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ VC \ bin \ cvtres.exe
  2. C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ VC \ bin \ cvtres.exe
  3. C: \ Program Files (x86) \ Microsoft Visual Studio 13.0 \ VC \ bin \ cvtres.exe

    Затем замените на C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ cvtres.exe. Со мной, сделайте 3 шага, это работает

Хунг Фам
источник
4

По состоянию на январь 2014 года, по каким-то причинам я установил .NET Framework 4.5.1, я не знаю, из-за сторонней установки программного обеспечения или из-за автоматического обновления.

29 января я установил один компонент и начал получать

LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt 

сообщение. В то время я решил, избегая добавочной ссылки.

31 января я установил еще один компонент .NET Framework 4.5.1, и трюк с инкрементной связью больше не работал. Затем я установил Visual Studio 2010 SP1, но впоследствии проблема стала:

Error   6   error LNK1104: cannot open file 'msvcrtd.lib'. 

Я думаю, что SP1 испортил мою установку Visual Studio 2010.

Поэтому я удалил .NET Framework 4.5.1, установил .NET Framework 4.0, удалил, а затем переустановил Visual Studio 2010. Это сработало для меня.

JackOLantern
источник
3

Даже несмотря на установку пакета обновления, вы получаете сообщение об ошибке, а затем попробуйте удалить / переименовать файл cvtres.exe в папке C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin. Это сработало для меня.

ботан
источник
Это сработало для меня. Но я не понял, как это было проблемой. Буду признателен, если вы можете сказать мне. Спасибо.
DTdev
2
В ответе ниже @Rich Peck объяснил причину такого поведения.
ботаник
1

Я установил параметр Включить инкрементную ссылку на «Нет (/ INCREMENTAL: NO)», и он не работает для меня .

Затем я изменился:

Project Properties 
   -> Configuration Properties 
       -> General
          -> Platform Toolset -> "Visual Studio 2012 (v110)"

и у меня это работает :)

sma6871
источник
Это не будет работать, если вам нужно создать исполняемый файл, который можно отлаживать на платформе WinXP.
Джей Элстон
извините, но это не решение .. вы меняете набор инструментов, который является совершенно другим компилятором
Semih Ozmen
1

Переустановка CMake у меня сработала. Новая копия CMake выяснила, что она должна использовать Visual Studio 11 вместо 10.

naroom
источник
1

Я использовал Windows SDK для программирования ядра Win32 и установил .NET 4.5 по неизвестным причинам. Я удалил это и установил 4.0 как предыдущие ответы, и да, это работало и для меня.

Просто ошеломлен, что мне пришлось использовать бесполезную платформу .NET для создания приложений Win32 с использованием SDK.

Виджай Кумар Канта
источник
1

Я решил это, сделав следующее:

  1. В командной строке введите msconfig и нажмите ввод.
  2. Нажмите вкладку услуг.
  3. Найдите «Application Experience» и поставьте галочку (то есть выберите это, чтобы включить).
  4. Нажмите ОК. И перезагрузите при необходимости.

Таким образом, проблема будет идти навсегда. Создавайте случайно и отлаживайте ваши C ++ проекты без каких-либо помех.

Приложение Работа
источник
Вы также можете включить службу Applicaton Experienc из services.msc
Работа приложения
2
Что это делает для решения проблемы?
Мабрахам
1

Для тех из вас, кто ищет решение этой проблемы с примерами исходного кода OpenGL SuperBible 6-й, решение строится в Release, а не в Debug . Во всех проектах отключена опция инкрементного связывания в версии Release .

Gallo
источник
1

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

Mihai
источник
1

У меня возникла та же проблема после обновления .NET: сначала я удалил .NET Framework, скачал Visual Studio с visualstudio.com и выбрал «ремонт».

NET Framework были установлены автоматически с Visual Studio -> и теперь она работает отлично!

Александр Хоменко
источник
1

Я попытался несколько раз и, наконец, решил проблему, удалив несколько раз VS2010. Я думаю, что я не удалил все файлы, и поэтому он не работал в первый раз.

При установке VS2012 говорится, что если у вас VS2010 SP1, вы не можете работать над одним и тем же проектом в обеих программах. Рекомендуется иметь только одну программу.

Спасибо!

Vengage
источник
1

У меня была эта проблема после того, как я установил Visual Studio 2017 и .NET Framework 4.6 на компьютере, на котором ранее была Visual Studio 2010.

Проблема заключалась в том, что после такой установки файл msvcr100_clr0400.dll из C: \ Windows \ System32 был перезаписан новым с очень маленьким размером ~ 19 КБ, однако прежний был ~ 800 КБ.

После того, как я восстановил файл вручную с другой машины сборки, cvtres.exe снова начал работать правильно.

Александр Самойлов
источник