Fehler LNK2038: Nichtübereinstimmung für '_MSC_VER' festgestellt: Wert '1600' stimmt nicht mit Wert '1700' in CppFile1.obj überein

69

Ich habe meine Projekte von VS2010 auf VS2012 konvertiert. In bestimmten Projekten wird jedoch ein _MSC_VER-Linkerfehler angezeigt. Nach langem Surfen durch Google stellte ich fest, dass das Problem auf die Verknüpfung einer in VS2010 erstellten Bibliothek mit VS2012 zurückzuführen ist.

Wie kann ich herausfinden, welches Projekt den Fehler verursacht? Hier zitiere ich den Fehler:

Error   6   error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj      D:\ProjectLocation\Projectname1.lib(CppFile2.obj) Projectname2
Error   15  error LNK2001: unresolved external symbol "private: static void __cdecl std::locale::facet::_Facet_Register(class std::locale::facet *)" (?_Facet_Register@facet@locale@std@@CAXPAV123@@Z)  D:\ProjectLocation\Projectname1.lib(CppFile3.obj)   Projectname2
Error   13  error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj    D:\ProjectLocation\Projectname1.lib(CppFile4.obj)   Projectname2
Error   12  error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj    D:\ProjectLocation\Projectname1.lib(CppFile5.obj)   Projectname2
Error   10  error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj    D:\ProjectLocation\Projectname1.lib(CppFile6.obj)   Projectname2
Error   11  error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj    D:\ProjectLocation\Projectname1.lib(CppFile7.obj)   Projectname2
Error   9   error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj    D:\ProjectLocation\Projectname1.lib(CppFile8.obj)   Projectname2
Error   4   error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj       D:\ProjectLocation\Projectname1.lib(CppFile9.obj)    Projectname2
Error   14  error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj    D:\ProjectLocation\Projectname1.lib(CppFile10.obj)  Projectname2
Error   7   error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj    D:\ProjectLocation\Projectname1.lib(CppFile11.obj)  Projectname2
Error   8   error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj    D:\ProjectLocation\Projectname1.lib(CppFile12.obj)  Projectname2
Error   5   error LNK2038: mismatch detected for '_MSC_VER': value '1600' doesn't match value '1700' in CppFile1.obj    D:\ProjectLocation\Projectname1.lib(CppFile13.obj)  Projectname2
tjdoubts
quelle

Antworten:

92

Sie versuchen, Objekte zu verknüpfen, die von verschiedenen Versionen des Compilers kompiliert wurden. Dies wird in modernen VS-Versionen nicht unterstützt, zumindest nicht, wenn Sie die C ++ - Standardbibliothek verwenden. Verschiedene Versionen der Standardbibliothek sind binär inkompatibel. Daher müssen alle Eingaben in den Linker mit derselben Version kompiliert werden. Stellen Sie sicher, dass Sie alle Objekte, die verknüpft werden sollen, neu kompilieren.

Der Compilerfehler benennt die beteiligten Objekte so, dass die Informationen in der Frage bereits die Antwort enthalten, nach der Sie suchen. Insbesondere scheint es, dass die statische Bibliothek, die Sie verknüpfen, neu kompiliert werden muss.

Die Lösung besteht also darin, Projectname1.lib mit VS2012 neu zu kompilieren.

David Heffernan
quelle
Vielen Dank, David. Was Sie sagen, ist das Problem mit den CPP-Dateien? Ich habe alle Änderungen an den Projektdateien vorgenommen, indem ich das <PlatformToolset> v110 </ PlatformToolset> hinzugefügt habe. Ich denke, das Problem liegt möglicherweise nicht bei der Projektdatei, nicht wahr?
tjdoubts
2
Nein, es sind die Objektdateien. Was der Compiler ausgibt. Sie scheinen sich in der LIB-Datei zu befinden. Sie müssen es neu kompilieren.
David Heffernan
Hallo David, ich bin neu in C ++. Ich bin im Grunde ein AC # -Programmierer. Können Sie bitte die Kommentare
ausarbeiten
5
Der Compiler fordert Sie auf, Projectname1.lib mit VS2012 neu zu kompilieren.
David Heffernan
1
In meinem Fall wurde die lib-Datei nicht einmal kompiliert, was den Fehler "Programmdatenbankdatei 'vc80.pdb' hat ein veraltetes Format, lösche es und kompiliere es" ergibt. Ich habe getan, was der Compiler empfohlen hat, und jetzt kompiliert er sowohl die Bibliothek als auch das Projekt, das von der Bibliothek abhängt.
Sergiol
41

Stellen Sie für jedes Projekt in Ihrer Lösung sicher, dass

Eigenschaften> Konfig. Eigenschaften> Allgemein> Plattform-Toolset

ist eine für alle, v100 für Visual Studio 2010, v110 für Visual Studio 2012

Möglicherweise arbeiten Sie auch an v100 aus Visual Studio 2012

Ahmed U3
quelle
Wo ist diese Einstellung für C # -Projekte?
Sergiol
@sergiol, das PlatformToolset-Attribut ist ein MSBuild-Attribut, mit dem die Version des C ++ - Toolset angegeben wird. Dieses Attribut hat also nichts mit C # zu tun.
Cary
4

Ich habe auch einige Projekte von VS2010 nach VS 2012 importiert. Ich hatte die gleichen Fehler. Die Fehler verschwanden, als ich Eigenschaften> Konfiguration zurücksetzte. Eigenschaften> Allgemein> Platform Toolset auf v100 (VS2010). Dies ist jedoch möglicherweise nicht der richtige Ansatz.

Jinxi
quelle
Dies sollte keine Antwort sein, sondern eine neue Frage.
Drescherjm
3

Ich habe ein Upgrade von 2010 auf 2013 durchgeführt. Nachdem ich das Platform Toolset aller Projekte geändert habe, muss ich mit der rechten Maustaste auf die Lösung klicken und Retarget ... auswählen, damit sie funktioniert.

Hai Tran
quelle