LNK2022 d'Erreur Lors de l'Utilisation /clr
Je vais avoir un problème de liaison d'un projet C++ dans VS2008 lors de l'utilisation de la /clr
option de compilation. Je suis l'obtention des erreurs de build:
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
Je n'ai aucune idée de ce que PROPSHEETPAGEA
et PROPSHEETPAGEW
se réfère. J'ai vérifié en ligne pour voir Microsoft description de l'erreur mais je suis à une perte quant à ce qu'il signifie.
http://support.microsoft.com/kb/324088
Pour résoudre ce problème, ajoutez les identificateurs uniques lorsque vous utilisez des Extensions managées pour C++ afin de vous éviter l'utilisation anonyme des structures comme des variables globales.
Microsoft a confirmé l'existence de ce bogue dans les produits Microsoft répertoriés au début de cet article. Ce bogue a été corrigé dans Microsoft Visual C++ .NET (2003).
Toutes les idées seraient grandement appréciés.
MODIFIER
Après avoir fait un ildasm sur Class1.obj j'en ai extrait deux messages:
//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)
Je ne suis pas sûr de ce que tout cela signifie, mais il semble comme si la deuxième entrée est identique à la première, à l'exception des attributs définis à l'envers.
OriginalL'auteur lumberjack4 | 2010-10-11
Vous devez vous connecter pour publier un commentaire.
J'ai eu exactement ce même problème aujourd'hui sur un de mes projets.
Je l'ai résolu en réorganisant mes fichiers d'en-tête. Le problème est que j'avais déplacé un fichier d'en-tête en haut de la rpc dossier, avant que le fichier y compris les windows.h.
Donc, une fois que j'ai repris les inclure ordre, et de mettre windows.h, retour au sommet de la rpc fichier, il fixe tout.
très bizarre corriger le problème, mais cela a fonctionné pour moi.
OriginalL'auteur C Johnson
J'ai résolu ce problème simplement en faisant un "nettoyage" sur l'ensemble de la solutuion. Semble que cela peut se produire si VS mêle les choses en place.
OriginalL'auteur user1603061
Il semble que vous êtes en train de faire quelque chose comme ceci:
qui est anonyme. Si vous le remplacez par:
qui devrait corriger les erreurs.
PROPSHEETPAGEA et PROPSHEETPAGEW sont Windows structures. Il me semble que l'en-tête où ces structures sont définies (prsht.h) ne se comporte pas bien dans le CLR. Est-il une chance que cet en-tête est inclus quand il n'a pas besoin de l'être? Vous pourriez avoir à réorganiser le code pour exclure les en-têtes qui ne sont pas nécessaires par le projet au sein de votre solution.
OriginalL'auteur Mark B
J'ai eu le même problème aujourd'hui, la migration de mon projet de vs2008 à vs2010. Lors de la compilation d'un CLI projet que des liens avec d'autres libs C++, j'ai eu cette erreur de lien sur:
J'ai essayé ildasm que la documentation suggèrent, mais ne pouvait pas trouver n'importe quel type de définitions qui semble le même, mais avoir des noms différents.
de plus, je dois dire que je ne comprends pas complètement cette erreur. Le fait que deux erreurs apparaissent signifie qu'il y a deux problèmes différents avec les deux types (chaîne de char et wchar chaîne) ou veut-il dire qu'il y a un problème que ces deux types sont à l'origine. Quel est le sens des nombres à la fin de la ligne (je n'ai trouver deux typedefs sur le ildasm journal avec ces chiffres, bien qu'). Il n'y a rien à ce sujet dans la documentation.
BTW - mêmes projets, même configuration compile et associe parfaitement avec vs2008.
De toute façon, perdu dans le noir, j'ai tourné mon autre C++ lib, qui ont un lien avec la CLI de projet, dans un CLI projet (le compiler avec /clr drapeau). re-lier le principal CLI projet semble résoudre le problème. En quelque sorte, l'ajout du support clr ou la liaison avec clr résoudre ce types de collision.
Si quelqu'un a un éduqués explication à ce problème je serais ravi de le lire.
OriginalL'auteur G.C.
J'ai été confronté au même genre de problème, mais plus tard, j'ai trouvé que la classe qui a été montré dans l'erreur a été inclus deux fois. J'avais stocké ma classe principale de l'en-tête de fichier dans mon répertoire de projet à des fins de sauvegarde, et l'original a été résidant dans le inclure le dossier de mon projet. C'est arrivé parce que j'avais compris ces deux chemins de répertoire dans mon projet de "comprendre l'Ajout du Fichier Chemin d'accès de la propriété".
OriginalL'auteur Chirag
Cette erreur n'apparaît que dans la version de débogage, c'est une sorte de compilateur bug. Pour corriger cela, vous pouvez basculer projet de création d'
de
à
MultiThreaded Dll (MD)
(DLL). Mais alors vous aurez des problèmes avec le débogage de ce code (par exemple, avec des points d'arrêt)Une autre façon est de se débarrasser de l'utilisation de la stl classes dans le code mixte: complètement dans le projet, ou en partie: divisez votre projet en pur natif (avec des classes de la Stl) et mixtes pièces, de créer différents en-têtes précompilés pour eux, éteignez /clr pour l'ensemble du projet, et de l'allumer seulement pour le rpc avec du code mixte.
OriginalL'auteur Choufler
Dans mon cas, une déclaration de classe était à la charge sur certains
#define
déclaré dans un .h (test#ifdef
)dont j'ai oublié d'inclure dans l'un des fichiers à l'aide. Dans la suite de l'éditeur de liens a 2 différentes descriptions de la classe.Dans cette situation, vérifiez que tous les fichiers qui contiennent le fichier avec conditionnelle déclaration.
OriginalL'auteur Dmitry Prihodko
Dans l'un des projets dépendants stdafx.h ne contient pas la déclaration suivante:
Le résultat est différent de la compilation du fichier prsht.h dans divers projets.
Dans ce nom de fichier est déclaré à la structure, avec _PROPSHEETPAGE.
VS 2008
OriginalL'auteur Mikhael
J'ai moi aussi eu ce problème récemment. Il semble qu'avant j'ai fait mon travail, j'avais fait une autre forme, mais l'a supprimé. Mais de toute façon l'un de ses .fichier cpp est resté. Jusqu'au moment où je l'ai remarqué, j'ai eu cette erreur. Une fois que j'ai enlevé le .rpc fichier supprimé forme, le prblem s'en alla.
OriginalL'auteur yash upadhyay