Błąd „LINK: błąd krytyczny LNK1123: błąd podczas konwersji do COFF: plik jest nieprawidłowy lub uszkodzony” po zainstalowaniu programu Visual Studio 2012 Preview Preview


535

Zainstalowałem wersję Visual Studio 2012 Preview i wydaje się być w porządku, ale teraz, gdy próbuję użyć Visual Studio 2010 do kompilacji projektów C ++, pojawia się następujący komunikat o błędzie:

LINK: błąd krytyczny LNK1123: błąd podczas konwersji do COFF: plik jest nieprawidłowy lub uszkodzony

Nie jestem tego w 100% pewien, ale wydaje się, że jest to związane z projektami, w których znajdują się .rcpliki (zasobów).

Próbowałem naprawić program Visual Studio 2010 z Dodaj / Usuń programy i zrestartować komputer, ale to nie działa.

Ten sam błąd pojawia się również, jeśli korzystam z programu Visual Studio 2012 RC do kompilacji projektów C ++, gdy jest ustawiony na używanie zestawu narzędzi Visual Studio 2010. Aktualizacja do zestawu narzędzi Visual Studio 2011 rozwiązuje problem (ale oczywiście nie chcę tego robić w przypadku kodu produkcyjnego).

Aktualizacja: odinstalowałem Visual Studio 2012 , uruchomiłem ponownie, a problem nadal występuje! Wsparcie!


Czy to problem z x86, x64, czy oba? Widzę to w 32-bitowym systemie operacyjnym. Nie przypominam sobie, aby widziałem to w 64-bitowym systemie operacyjnym.
jww

Odpowiedzi:


652

Wątek MSDN wyjaśnia, jak to naprawić.

Podsumowując:

  • Wyłącz łączenie przyrostowe, przechodząc do

    Project Properties 
       -> Configuration Properties 
           -> Linker (General) 
              -> Enable Incremental Linking -> "No (/INCREMENTAL:NO)"
    
  • lub zainstaluj VS2010 SP1.

Edycje (@CraigRinger): Należy pamiętać, że instalacja VS 2010 SP1 usunie 64-bitowe kompilatory . Aby je odzyskać, musisz zainstalować pakiet kompilatora VS 2010 SP1 .

Dotyczy to Microsoft Windows SDK 7.1 dla Windows 7 i .NET 4.0, a także Visual Studio 2010 .


1
Natknąłem się na ten problem wkrótce po zainstalowaniu .Net 4.5. Zainstalowanie VS2010 SP 1 rozwiązało to. W żadnym momencie nie zainstalowałem VS 2012.
KJAWolf

2
Aby wyłączyć przyrostowe łączenie z CMakefile: cmake.org/pipermail/cmake/2010-Feb
Mapa X

2
W Qt w Visual Studio dodaj do swojego .pro: QMAKE_LFLAGS + = / INCREMENTAL: NIE Pracowałem dla mnie
gollumullog

5
@grundic Sortuj. Zmieniliśmy nazwę cvtres.exe z SD 7 Win 7, aby link.exe nie znalazł go i zamiast tego używa nowego z .NET 4.5. Zestaw SDK systemu Windows 8 nie zawiera już narzędzi wiersza polecenia. Musisz teraz zainstalować co najmniej Visual Studio 2012 Express dla komputerów stacjonarnych, aby uzyskać narzędzia wiersza polecenia aplikacji komputerowej. Rozwiązanie zmiany nazwy zostało uznane za najmniej zakłócające i można je łatwo skrypty.
DuckPuppy

2
@DuckPuppy na szczęście rozwiązaliśmy ten problem, całkowicie usuwając Microsoft .Net 4.5.1 z naszych agentów kompilacji i świeżo instalując .Net 4.0. Następnie uruchomiliśmy ponowną instalację pakietu Microsoft SDK 7.0 z zaznaczonymi wszystkimi opcjami - to rozwiązało nasze problemy. Ponadto po tym incydencie wyłączono automatyczne aktualizacje - na wszelki wypadek.
grundic

249

Jeśli wyłączenie przyrostowego łączenia nie działa, a wyłączenie „Embed Manifest” również nie działa, poszukaj ścieżki w wielu wersjach CVTRES.exe.

Po debugowaniu z opcją / VERBOSE linkera odkryłem, że linker zapisuje ten komunikat o błędzie, gdy próbował wywołać cvtres i nie powiodło się.

Okazało się, że miałem na swojej drodze dwie wersje tego narzędzia. Jeden o C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN\cvtres.exejeden i jeden o C:\Windows\Microsoft.NET\Framework\v4.0.30319\cvtres.exe. Po instalacji VS2012 wersja cvtres.exe VS2010 przestanie działać. Jeśli jest to pierwszy na twojej ścieżce, a linker zdecyduje, że musi przekonwertować plik .res do formatu obiektowego COFF, połączenie zakończy się niepowodzeniem z LNK1123.

(Naprawdę denerwujące, że komunikat o błędzie nie ma nic wspólnego z rzeczywistym problemem, ale nie jest to niczym niezwykłym w przypadku produktu Microsoft).

Wystarczy usunąć / zmienić nazwę starszej wersji narzędzia lub ponownie ustawić zmienną PATH, aby działająca wersja była na pierwszym miejscu.

Należy pamiętać, że w przypadku kompilacji narzędzi x64 może być konieczne sprawdzenie, C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64gdzie są inne cvtres.exe.


3
Pracował dla mnie. Dziękujemy za dodanie porady na temat / VERBOSE, która pokazuje, jak / dlaczego zamiast po prostu magicznej rzeczy do zrobienia.
M Katz

1
Po prostu skopiuj nowszy plik z katalogu Framework na stary w katalogu visual studio.
Yochai Timmer

To rozwiązało również mój problem. Pracuję na komputerze, który ma ścisły UAC, więc mogłem potwierdzić, który program cvtres.exe działał jako pierwszy z wiersza polecenia. Najpierw uruchomiono gdzie cvtres.exe. Następnie „C: \ windows \ Microsoft.NET \ Framework \ v4.0.30319.cvtres.exe / machine: amd64 / verbose / out:„ Name from verbose output ”/ readonly FileFromVerboutput.res. Jedna ścieżka pokazała błąd, .NET jeden zadziałał
użytkownik176692

50

Sprawdź wersję cvtrs.exe:

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

Niepoprawna wersja::
date03/18/2010
time: 01:16 PM
size: 31 048 bajtów
name: cvtres.exe

Prawidłowa wersja::
date02/21/2011
time: 06:03 PM
size: 31.056 bajtów
name: cvtres.exe

Jeśli masz niewłaściwą wersję, skopiuj poprawną wersję z:

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

i zastąp ten tutaj:

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

to znaczy

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"

Może to pomóc niektórym innym osobom z podobnymi problemami. Korzystam z kompilacji ms i musiałem skopiować te pliki: msobj110.dll mspdb110.dll mspdbcore.dll mspdbsrv.exe Z C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ Common7 \ IDE do C: \ Program Files ( x86) \ Microsoft Visual Studio 11.0 \ VC \ bin oprócz tego, zgodnie z i-am-bryan.com/webs/tutorials/…
Kell

To zadziałało dla mnie, ale mój „poprawny” plik cvtres.exe miał inny rozmiar, datę itp. (Jednak wciąż z bin VS 2012)
aampere

Dla mnie rozwiązany przez zmianę nazwy cvtres z katalogu .... Studio 10.0 \ VC \ bin \ amd64 \,. Myślę, że ponieważ używam danych wywiadowczych, a nie amd
Daniel Hári

46

Według tego wątku na forum MSDN: projekty VS2012 RC przerw instalacji VS2010 C ++ , po prostu wziąć cvtres.exez VS2010 SP1

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

lub z VS2012

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

i skopiuj go cvtres.exew instalacji VS2010 RTM (tej bez SP1 )

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

W ten sposób skutecznie wykorzystasz poprawioną wersję, cvtres.exektórej jest 11.0.51106.1.

Powtórz te same kroki dla 64-bitowej wersji narzędzia w C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\cvtres.exe.

To rozwiązanie jest alternatywą dla instalacji dodatku SP1 dla VS2010 - w niektórych przypadkach po prostu nie można zainstalować dodatku SP1 (tj. Jeśli potrzebujesz obsługi kompilacji sprzed wersji SP1).


1
To działało dla mnie. Ponieważ jestem na Win7 64-bit, najpierw skopiowałem cvtres.exe z folderu ... Framework64 \ v4.3 ..., ale to nie rozwiązało problemu. Następnie skopiowałem go z folderu Framework \ v4.3 ... i to rozwiązało problem DZIĘKUJEMY !!!!!
sokół

36

Jeśli zainstalowałeś Visual Studio 2012 RC, to zainstalował .NET 4.5 RC.

Odinstaluj .NET 4.5 RC i zainstaluj potrzebną wersję (4.0 dla VS 2010). To powinno wyjaśnić wszelkie twoje problemy.

To rozwiązało ten sam problem. Nie ma potrzeby odinstalowywania programu Visual Studio.


4
Świetny!! Wymieniłem tylko .NET 4.5 na .NET 4.0. i działa dobrze !!
manutd

1
aktualizacja: odinstalowanie .net 4.5 i 4.0 naprawia to dla mnie (VS 2010 express). jednak aktualizacja systemu Windows wydaje się ciągle aktualizować z powrotem do wersji .net 4.5.1, więc muszę to powtarzać co jakiś czas. Jednak instalacja „VS 2010 SP1” i voila, VS 2010 express działa teraz również z .Net 4.5.1 nadal zainstalowany.
rogerdpack

15

To dlatego, że .NET Framework 4.5 zastępuje .NET Framework 4.0. Odinstalowałem program Visual Studio 2010 kilka razy bez powodzenia. Po usunięciu .NET Framework 4.5 i ponownej instalacji programu Visual Studio 2010 poszło dobrze.

Zobacz Całkowicie odinstaluj Visual Studio 11, aby wykonać nową instalację .


3
Potwierdź to !!!!!!! Ponowna instalacja VC2010 nie pomaga. Po usunięciu framework4.5 RC jest OK.
inkooboo,

Zainstalowałem umdh, który instaluje .net 4.5, który zepsuł Visual Studio 2010. Po odinstalowaniu .net 4.5 i ponownej instalacji .net 4.0 moje studio wizualne wróciło do życia.
stu

14

Dla mnie ustawienie „Generuj manifest” na „Nie” naprawiło to. (Poprawiono także za pomocą / INCREMENTAL: NO)


14

Jeśli używasz x64, oto zasób pomoże :

Dzieje się tak, ponieważ Microsoft .NET 4.5 jest niezgodny z Visual C ++ 10. Obejściem tego problemu jest zapewnienie, że uruchomisz wersję cvtres.exe .NET zamiast wersji Visual C ++. Zrobiłem to, zmieniając nazwy tych plików w Visual C ++ i kopiując wersje .NET na ich miejsce.

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
uwaga: to działa, ponieważ oba .NET Framework 4 Multi-targeting pack i .NET Framework 4.5.2 są zainstalowane. Plik C:\windows\Microsoft.NET\Framework\v4.0.30319\cvtres.exenależy do .NET Framework 4 Multi-targeting pack. Zasadniczo tak będzie w przypadku zainstalowania zestawu Windows SDK 7.1, a następnie aktualizacji .NET do wersji 4.5.2. W takim przypadku możesz po prostu zmienić nazwę C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cvtres.exena, cvtres-old.exea nowsza cvtres.exewersja (z 30.08.17) zostanie użyta i będzie działać poprawnie.
David C. Rankin

13

Ostatecznie rozwiązałem ten problem, wykonując pełną deinstalację VS2012 RC, a następnie pełną deinstalację VS2010, a następnie ponowną instalację od zera VS2010.

Zajęło to wieczność, ale teraz mogę ponownie skompilować projekty C ++ w VS2010.


11

Problem został dla mnie magicznie rozwiązany poprzez usunięcie .NET 4.5 i zastąpienie go .NET 4.0 . Następnie musiałem naprawić program Visual Studio 2010 - który po drodze został uszkodzony.

Wcześniej zainstalowałem, a następnie odinstalowałem program Visual Studio 2012 - który może być związany z problemem.


2
To zadziałało dla mnie. Mam Net 4.5 jako ważną aktualizację Windows. Właśnie go odinstalowałem, co spowodowało, że kompilacja zakończyła się niepowodzeniem w nowy sposób. Następnie w pełni naprawiłem instalację programu Visual Studio 2010 Express i to rozwiązało problem.
hyde

10

Nie zainstalowałem programu Visual Studio 2012, ale nadal pojawia się ten błąd w programie Visual Studio 2010. Rozwiązałem go po zainstalowaniu programu Visual Studio 2010 z dodatkiem SP1.


9

Miałem ten sam problem z Microsoft Visual Studio 2010 Ultimate i został rozwiązany metodą opisaną w tym filmie na youtube

Film sugeruje zmianę nazwy pliku cvtres.exe w C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin (in my Win7X64 matchine) na cvtres-old.exe


6

+1 do użytkownika Skrót od odpowiedzi, która zadziałała dla mnie!

Próbowałem zrobić z tym trochę debugowania msbuild /v:diagi widzę, że MSBuild próbuje osadzić manifest w pliku wykonywalnym, używając <somename> .dll.embed.manifest.res w wierszu poleceń linkera, gdzie jest to zasób plik zbudowany z <nazwa> .dll.embed.manifest. Ale plik manifestu jest pustym plikiem tekstowym Unicode. (To znaczy dwubajtowy plik z prefiksem 0xFEFF Unicode)

Wydaje się, że problem root ma coś wspólnego z tym, że ten plik manifestu nie jest generowany lub jest używany, gdy należy użyć <somename> .dll.intermediate.manifest.

Alternatywnym rozwiązaniem wydaje się wyłączenie opcji „Manifest osadzania” w obszarze Właściwości, Narzędzie manifestu, Dane wejściowe i wyjściowe.


6

Nie działało to dla mnie po włączeniu łączenia przyrostowego -> „Nie (/ INCREMENTAL: NIE)”, ale działa dla mnie po usunięciu pliku rc.


5

Podsumowując:

Step1

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

jeśli krok 1 nie działa, wykonaj krok 2

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

jeśli krok 2 nie działa, wykonaj krok 3 Skopiuj plik z jednego z:

  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

    Następnie zamień na C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ cvtres.exe Ze mną zrób 3 kroki, aby to działało


4

Od stycznia 2014 r. Z kilku powodów zainstalowałem .NET Framework 4.5.1, nie wiem czy z powodu instalacji oprogramowania innej firmy, czy też automatycznej aktualizacji.

29 stycznia zainstalowałem jeden komponent i zacząłem otrzymywać

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

wiadomość. W tym czasie rozwiązałem problem, unikając przyrostowego łącza.

31 stycznia zainstalowałem kolejny komponent .NET Framework 4.5.1 i sztuczka przyrostowego łącza już nie działała. Następnie zainstalowałem dodatek SP1 dla programu Visual Studio 2010, ale potem problem stał się:

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

Myślę, że dodatek SP1 zepsuł moją instalację programu Visual Studio 2010.

Więc odinstalowałem .NET Framework 4.5.1, zainstalowałem .NET Framework 4.0, a następnie odinstalowałem, a następnie ponownie zainstalowałem Visual Studio 2010. To zadziałało dla mnie.


3

Nawet pomimo zainstalowania dodatku Service Pack pojawia się błąd, a następnie spróbuj usunąć / zmienić nazwę pliku cvtres.exe w folderze C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin. To zadziałało dla mnie.


To zadziałało dla mnie. Ale nie zrozumiałem, jak to był problem. Byłoby mile widziane, jeśli możesz mi powiedzieć. Dzięki.
DTdev,

2
W poniższej odpowiedzi @Rich Peck wyjaśnił przyczynę tego zachowania.
nerd

1

Ustawiam Enable Incremental Linking na „No (/ INCREMENTAL: NO)” i to nie działa dla mnie .

Następnie zmieniłem:

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

i to działa dla mnie :)


To nie zadziała, jeśli musisz utworzyć plik wykonywalny, który można debugować na platformie WinXP.
Jay Elston,

przepraszam, ale to nie jest rozwiązanie. Zmieniasz zestaw narzędzi, który jest zupełnie innym kompilatorem
Semih Ozmen

1

Ponowna instalacja CMake działała dla mnie. Nowa kopia CMake zorientowała się, że powinien używać Visual Studio 11 zamiast 10.


1

Korzystałem z zestawu Windows SDK do podstawowego programowania Win32 i miałem .NET 4.5 zainstalowany z „nieznanych” powodów. Odinstalowałem to i zainstalowałem 4.0 jak poprzednie odpowiedzi i tak, to zadziałało również dla mnie.

Po prostu jestem oszołomiony, że musiałem używać bezużytecznej platformy .NET do budowania aplikacji Win32 za pomocą SDK.


1

Rozwiązałem to, wykonując następujące czynności:

  1. W wierszu polecenia wpisz msconfig i naciśnij klawisz Enter.
  2. Kliknij kartę usługi.
  3. Poszukaj „Application Experience” i zaznacz znacznik wyboru (to znaczy wybierz to, aby włączyć).
  4. Kliknij OK. I uruchom ponownie, jeśli to konieczne.

Tak więc problem zniknie na zawsze. Twórz losowo i debuguj swoje projekty w C ++ bez żadnych zakłóceń.


Możesz także włączyć usługę Applicaton Experienc z services.msc
App Work

2
Co to robi, aby rozwiązać problem?
mabraham

1

Dla tych, którzy szukają rozwiązania tego problemu z przykładowymi kodami źródłowymi OpenGL SuperBible 6, rozwiązaniem jest budowanie w wersji zamiast debugowania . Wszystkie projekty wyłączyły opcję przyrostowego łączenia w wersji Release .


1

Mój problem polegał na tym, że na komputerze mam dwie ścieżki zawierające te same biblioteki. Obie ścieżki zostały dodane do dodatkowych katalogów bibliotecznych we Właściwościach konfiguracji -> Łącznik -> Ogólne . Usunięcie jednej ze ścieżek rozwiązało problem.



1

Próbowałem kilka razy i w końcu rozwiązałem problem, kilkakrotnie odinstalowując VS2010. Myślę, że nie odinstalowałem wszystkich plików i dlatego nie zadziałało po raz pierwszy.

Podczas instalacji VS2012 mówi się, że jeśli masz VS2010 SP1, nie możesz pracować nad tym samym projektem w obu programach. Zaleca się mieć tylko jeden program.

Dzięki!


1

Miałem ten problem po zainstalowaniu Visual Studio 2017 i .NET Framework 4.6 na komputerze, który wcześniej miał Visual Studio 2010.

Problem polegał na tym, że po takiej instalacji plik msvcr100_clr0400.dll z C: \ Windows \ System32 został nadpisany nowym plikiem o bardzo małym rozmiarze ~ 19 Kb, jednak poprzedni miał rozmiar ~ 800 Kb.

Po ręcznym przywróceniu pliku z innej maszyny kompilacyjnej cvtres.exe zaczął działać poprawnie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.