LNK2022 Fehler Bei der Verwendung von /clr
Ich habe ein problem mit dem verknüpfen eines C++ - Projekt in VS2008 bei der Verwendung der /clr
compile-option. Ich erhalte die folgende build-Fehler:
Class1.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEA): (0x0200046f).
Class1.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEW): (0x02000473).
Class2.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEA): (0x0200046f).
Class2.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEW): (0x02000473).
Class3.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEA): (0x0200046e).
Class3.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEW): (0x02000472).
Class4.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEA): (0x0200046e).
Class4.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEW): (0x02000472).
Class5.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEA): (0x0200046e).
Class5.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEW): (0x02000472).
Class6.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEA): (0x0200046e).
Class6.obj : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (_PROPSHEETPAGEW): (0x02000472).
LINK : fatal error LNK1255: link failed because of metadata errors
Ich habe keine Ahnung, was PROPSHEETPAGEA
und PROPSHEETPAGEW
bezogen werden. Ich online überprüft, um zu sehen, Microsoft ' s Beschreibung der Fehler, aber ich bin an einem Verlust, was es bedeutet.
http://support.microsoft.com/kb/324088
Um dieses problem zu beheben, hinzufügen von eindeutigen Kennungen, wenn Sie Managed Extensions für C++, so dass Sie vermeiden Sie die Verwendung von anonymen Strukturen als Globale Variablen.
Microsoft hat bestätigt, dass dies einen Fehler in Microsoft-Produkten, die aufgeführt sind zu Beginn dieses Artikels. Dieser Fehler wurde behoben in Microsoft Visual C++ .NET (2003).
Irgendwelche Ideen würde sehr geschätzt werden.
BEARBEITEN
Nachdem ich ein ildasm auf Class1.obj ich extrahierten zwei Nachrichten:
//TypeDef #1134 (0200046f)
//-------------------------------------------------------
// TypDefName: _PROPSHEETPAGEA (0200046F)
// Flags : [NotPublic] [SequentialLayout] [Class] [Sealed] [AnsiClass] [BeforeFieldInit] (00100108)
// Extends : 0100000B [TypeRef] System.ValueType
// Layout : Packing:0, Size:56
// CustomAttribute #1 (0c0012a0)
// -------------------------------------------------------
// CustomAttribute Type: 0a000003
// CustomAttributeName: Microsoft.VisualC.MiscellaneousBitsAttribute :: instance void .ctor(int32)
// Length: 8
// Value : 01 00 41 00 00 00 00 00 > A <
// ctor args: (65)
//
// CustomAttribute #2 (0c0012a1)
// -------------------------------------------------------
// CustomAttribute Type: 0a000001
// CustomAttributeName: Microsoft.VisualC.DebugInfoInPDBAttribute :: instance void .ctor()
// Length: 4
// Value : 01 00 00 00 > <
// ctor args: ()
//
// CustomAttribute #3 (0c0012a2)
// -------------------------------------------------------
// CustomAttribute Type: 0a000004
// CustomAttributeName: System.Runtime.CompilerServices.NativeCppClassAttribute :: instance void .ctor()
// Length: 4
// Value : 01 00 00 00 > <
// ctor args: ()
//TypeDef #1138 (02000473)
//-------------------------------------------------------
// TypDefName: _PROPSHEETPAGEW (02000473)
// Flags : [NotPublic] [SequentialLayout] [Class] [Sealed] [AnsiClass] [BeforeFieldInit] (00100108)
// Extends : 0100000B [TypeRef] System.ValueType
// Layout : Packing:0, Size:56
// CustomAttribute #1 (0c0012b0)
// -------------------------------------------------------
// CustomAttribute Type: 0a000004
// CustomAttributeName: System.Runtime.CompilerServices.NativeCppClassAttribute :: instance void .ctor()
// Length: 4
// Value : 01 00 00 00 > <
// ctor args: ()
//
// CustomAttribute #2 (0c0012b1)
// -------------------------------------------------------
// CustomAttribute Type: 0a000001
// CustomAttributeName: Microsoft.VisualC.DebugInfoInPDBAttribute :: instance void .ctor()
// Length: 4
// Value : 01 00 00 00 > <
// ctor args: ()
//
// CustomAttribute #3 (0c0012b2)
// -------------------------------------------------------
// CustomAttribute Type: 0a000003
// CustomAttributeName: Microsoft.VisualC.MiscellaneousBitsAttribute :: instance void .ctor(int32)
// Length: 8
// Value : 01 00 41 00 00 00 00 00 > A <
// ctor args: (65)
Ich bin mir nicht sicher, was das alles bedeutet, aber es sieht aus, als wenn der zweite Eintrag ist identisch mit dem ersten, mit Ausnahme der Attribute, die definiert wird rückwärts.
- Ich meine modifizierten Aufbau der Lösung zu house alle verwalteten code in einem einzelnen Projekt anstelle von mehreren Projekten, und der Fehler ist verschwunden. Es wird für immer ein Geheimnis...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte das exakt gleiche problem, heute auf einem meiner Projekte.
Ich löste es durch umstellen meiner header-Dateien. Problem war, ich hatte verschoben, eine header-Datei, die oben in der cpp-Datei, bevor die Datei, einschließlich windows.h.
So, nachdem ich zurückgesetzt, die include-Reihenfolge und windows.h zurück an der Spitze der cpp-Datei, es befestigt alles.
sehr seltsame Lösung, aber es funktionierte für mich.
Ich löste dieses Problem, indem Sie einfach tun ein "clean" auf die gesamte solutuion. Es scheint, dass dies nur geschehen kann, wenn der VS mischt sich die Dinge.
Es klingt wie Sie tun etwas wie dieses:
ist anonym. Wenn Sie es zu ändern:
sollte das beheben die Fehler.
Ich hatte das gleiche problem heute, die Migration meines Projekts von vs2008 zu vs2010. Während der Kompilierung ein CLI-Projekt, das Verknüpfungen mit anderen C++ - libs, bekam ich diesen link-Fehler auf:
Versuchte ich ildasm als die Dokumentation vermuten, konnte aber nicht finden, alle Typ-Definitionen, scheint dasselbe aber mit einem anderen Namen.
zudem muss ich sagen das ich nicht ganz verstehen, dieser Fehler. Die Tatsache, dass zwei Fehler angezeigt werden, bedeutet, dass es zwei unterschiedliche Probleme mit beiden Typen (char, string und wchar-string) oder bedeutet es, dass es ein problem ist, dass diese beiden Typen verursacht werden. Was ist die Bedeutung der Nummern am Ende der Zeile (ich habe zwei typedefs auf dem ildasm-log mit diesen zahlen, obwohl). Es ist nichts darüber in der Dokumentation.
BTW - gleichen Projekte -gleiche Konfiguration kompiliert und links perfekt mit vs2008.
Sowieso, verloren in der Dunkelheit, wandte ich mich meinen anderen C++ - lib, der die Verbindung mit der CLI-Projekt, in ein CLI-Projekt als auch (kompilieren mit /clr flag). eines der wichtigsten CLI-Projekt scheint das problem zu lösen. Irgendwie hinzufügen der clr-Unterstützung oder Verbindung mit clr beheben diese Arten der Kollision.
Wenn jemand eine fundierte Erklärung zu dieser Frage, die ich lieben würde, es zu Lesen.
Ich Stand vor der gleichen Art von problem, aber später habe ich festgestellt, dass die Klasse, die gezeigt wurde, in der Fehler war zweimal dabei. Ich hatte gespeichert, meine main-Klasse header-Datei in mein Projekt-Verzeichnis für backup-Zwecke, und die original wurde, die Ihren Wohnsitz in den include-Ordner von meinem Projekt. Es geschah, weil ich hatte diese zwei Pfade in meinem Projekt "Gehören Neben File Path" - Eigenschaft.
Dieser Fehler erscheint nur in der debug-version, es ist eine Art von compiler-Fehler. Um es zu beheben, kann man den Schalter Projekt-Einstellung
vom
zu
MultiThreaded Dll (MD)
(für DLL). Aber dann haben Sie Probleme mit Debuggen dieses Codes (z.B. breakpoints)Ein anderer Weg ist, um loszuwerden der Verwendung von stl-Klassen in gemischten code: vollständig in das Projekt, oder teilweise: teilen Sie Ihr Projekt in rein native (mit Stl-Klassen) und gemischte Teile, verschiedene vorkompilierte Header für Sie switch-off /clr für das gesamte Projekt und schalte es nur für cpp ist mit mixed code.
In meinem Fall eine Klasse Erklärung war abhängig von einigen
#define
deklariert .h (Prüfung#ifdef
), die ich vergaß zu zählen, die in einer der Dateien verwenden. Im Ergebnis linker hatte 2 verschiedene Beschreibungen der Klasse.In dieser situation überprüfen alle Dateien, einschließlich der zugehörigen Datei mit der bedingten Erklärung.
In einem der abhängigen Projekte stdafx.h nicht enthalten, die folgende Erklärung:
Ist das Ergebnis verschiedener Zusammenstellung-Datei prsht.h in verschiedenen Projekten.
In dieser Datei-name ist die deklarierte Struktur mit _PROPSHEETPAGE.
VS 2008
Auch ich hatte dieses problem vor kurzem. Es scheint, dass, bevor ich einen meiner form, die ich gemacht hatte eine andere form, aber es gelöscht. Aber irgendwie eines seiner .cpp-Datei blieb. Bis zu der Zeit, ich bemerkte es, hatte ich diesen Fehler. Einmal habe ich entfernt .cpp-Datei der gelöschten form, das prblem ging Weg.