LNK2022 opération de métadonnées: Des informations de mise en page dans dupliqué types
Je vais avoir un nouveau-pour-moi de l'éditeur de liens d'erreur dans un projet, je travaille avec:
1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std.basic_string<char,std::char_traits<char>,std::allocator<char> >): (0x0200004e).
1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std.basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >): (0x02000075).
1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std._String_iterator<char,std::char_traits<char>,std::allocator<char> >): (0x02000091).
1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std._String_const_iterator<char,std::char_traits<char>,std::allocator<char> >): (0x02000092).
1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std._String_val<char,std::allocator<char> >): (0x02000097).
1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std._String_val<wchar_t,std::allocator<wchar_t> >): (0x02000099).
Nous sommes à l'aide de Visual Studio 2010 dans Windows 7.
Ce projet a utilisé pour compiler. C'est un C++/CLI wrapper DLL autour de certains de code non managé, et inclut donc Common Language Runtime Support. La chose qui a changé est qu'un statique externe de la bibliothèque que nous avons lié à a été "mis à jour". Nous sommes maintenant se cette erreur quand on essaie de compiler le projet qui en lien.
Microsoft "aide" pour cette question est de "faire fonctionner ildasm –jetons sur les fichiers objets à trouver quels types de jetons répertoriés dans error_message, et de chercher les différences". Puis j'ai vérifié cette page et a remarqué que le /tokens
option n'est valide que pour .exe et .les fichiers dll... mais c'est une erreur de l'éditeur de liens, donc mon .fichier dll n'est pas encore fait!
J'ai essayé de lancer des choses comme ildasm -tokens AssemblyInfo.obj
, mais la seule chose qui se passe est qu'une fenêtre s'ouvre avec cette incroyablement utile, message d'erreur:
Merci Microsoft!
Je ne suis pas vraiment sûr de savoir comment poursuivre la résolution de ce problème. Une version Release fonctionne correctement-c'est seulement le Debug qui est foiré. Donc quelque part dans le mix je suppose que le std::string
type est d'une taille différente ou quelque chose...
Des idées?
Merci pour la recommandation, j'ai fait plein reconstruit, sans succès. Je pense que je suis sur la piste de quelque chose ici, mais...
OriginalL'auteur aardvarkk | 2012-08-16
Vous devez vous connecter pour publier un commentaire.
Bon, j'ai trouvé! Il n'y a DONC, la question d'une autre qui était en fait une grande aide. Il a fini par en les reliant à la cet article, qui avait un peu plus de détails sur le problème. En gros, c'est un problème avec la bibliothèque standard de chaînes se compilé à la fois réussi et le code non managé. La solution est d'activer le CLR sur les fichiers qui en ont besoin. Dans le détail, voici ce que j'ai fait:
/clr
interrupteur qui s'applique à la ensemble du projet.cpp
les fichiers qui sont effectivement nécessaires le CLR, et sélectionnés manuellement/clr
sousC/C++ -> General -> Common Language RunTime Support
.Program Database /Zi
deProgram Database for Edit and Continue /ZI
. Il s'est débarassé de mises en garde, parce que je pense que/clr
le soutien semble désactiver la liaison incrémentielle, et puis mon code natif jetait des mises en garde parce qu'il a essayé de l'utiliser de Modifier et Continuer.ExtensionAttribute
avertissements, que j'ai corrigé en suivant les instructions sur cette page, de manière efficace d'ajouter les options suivantes à mon/clr
-permis de fichiers:/clr:nostdlib /AI"%ProgramFiles%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
/clr
-permis de fichiers. Plus précisément, en vertu deC/C++ -> Code Generation
, j'ai misEnable Minimal Rebuild
àNo (/RM-)
, etBasic Runtime Checks
àDefault
. Cela se débarrasser d'un tas de mises en garde aussi.Enable C++ Exceptions
àNo
sur leclr
-permis de fichiers.Espérons que cette aide!
La seule chose que je pourrais recommander, c'est en quelque sorte essayer de diviser votre géré/code non managé par le biais de l'utilisation d'une bibliothèque liée dynamiquement, peut-être? Ce qui est arrivé à travailler pour moi, mais je ne suis pas sûr de savoir comment bien elle généralise...
Je le faisais déjà (mais c'est une bonne astuce néanmoins). Comme vous l'avez vu, j'ai été à tort reliant la bibliothèque gérée à inutiles non géré bibliothèques, inutilement causant la LNK2022.
Il est également provoquée par les différences entre les inclus
#defines
commeWINVER
ou_WIN32_WINNT
Lien mort sur l'étape 4.
OriginalL'auteur aardvarkk
Semble que mon Visual Studio était en quelque état rompu. J'ai été le seul à recevoir cette erreur.
Je n'avais pas de changements.
J'ai revérifier le projet sur le côté et il a été fixé.
C'était peut-être un problème avec mes fichiers de l'utilisateur.
Pour moi juste la reconstruction travaillé...
OriginalL'auteur Rubarb
Le correctif pour moi a été de définir les Propriétés de Configuration -> C/C++ -> Génération de Code -> Struct Membre de l'Alignement -> 16 Octets (/Zp16)
OriginalL'auteur JayC