2010-10-11 16 views
8

Tengo un problema al vincular un proyecto de C++ en VS2008 cuando uso la opción de compilación /clr. Estoy recibiendo los siguientes errores de compilación:LNK2022 Error al utilizar/clr

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 

no tengo idea de lo que PROPSHEETPAGEA y PROPSHEETPAGEW se refiere. Revisé en línea para ver la descripción del error de Microsoft, pero no entiendo qué significa. http://support.microsoft.com/kb/324088

Para resolver este problema, agregue los identificadores únicos cuando se utilizan extensiones para C++ administrado de manera que evite el uso de estructuras anónimas como variables globales.

Microsoft ha confirmado que se trata de un error de los productos de Microsoft enumerados al principio de este artículo. Este error se corrigió en Microsoft Visual C++ .NET (2003).

Cualquier idea sería muy apreciada.

EDITAR

Después de hacer un ildasm en Class1.obj extraje dos mensajes:

// 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) 

No estoy seguro de qué significa todo esto, pero parece como si la segunda entrada es idéntico al primero con la excepción de los atributos que se definen al revés.

+0

Modifiqué la configuración de mi solución para albergar todo el código administrado en un único proyecto en lugar de proyectos múltiples, y el error ha desaparecido. Siempre será un misterio ... – lumberjack4

Respuesta

4

Hoy tuve exactamente el mismo problema en uno de mis proyectos. Lo resolví reorganizando mis archivos de encabezado. El problema fue que había movido un archivo de encabezado a la parte superior del archivo cpp, antes del archivo que incluía windows.h. Así que, una vez que revertí el orden de incluir y volví a poner windows.h en la parte superior del archivo cpp, solucionó todo.

arreglo muy extraño, pero funcionó para mí.

+0

Aquí hay un enlace a MSDN que explica qué está sucediendo. http://msdn.microsoft.com/en-us/library/aa712965(VS.71).aspx –

1

Suena como que estás haciendo algo como esto:

struct 
{ 
    int a; 
    int b; 
} global_struct; 

que sea anónima. Si lo cambia a:

struct UniqueNameHere 
{ 
    int a; 
    int b; 
} global_struct; 

que debería corregir los errores.

+1

No veo este escenario emergente en ningún lugar de mi código. – lumberjack4

+0

PROPSHEETPAGEA y PROPSHEETPAGEW son estructuras de Windows. Me parece que el encabezado donde se definen estas estructuras (prsht.h) no se comporta bien en proyectos basados ​​en CLR. ¿Existe la posibilidad de que este encabezado se incluya cuando no es necesario? Es posible que deba reorganizar el código para excluir los encabezados que el proyecto no necesita dentro de su solución. –

1

Tuve el mismo problema hoy, migrando mi proyecto de vs2008 a vs2010. Al compilar un proyecto CLI que enlaza con otras librerías C++, tengo este error enlace en:

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> >): (0x0200004f). 
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). 

Probé ildasm como la documentación sugiere, pero no pudo encontrar ninguna definición de tipo que parece lo mismo pero tener un diferentes nombres .

Además, debo decir que no entiendo completamente este error. El hecho de que aparezcan dos errores significa que hay dos problemas diferentes con ambos tipos (cadena char y cadena wchar) o quiere decir que hay un problema que estos dos tipos están causando. ¿Cuál es el significado de los números al final de la línea (sin embargo, encontré dos typedefs en el registro ildasm con estos números). No hay nada de eso en la documentación.

BTW - mismos proyectos: la misma configuración compila y enlaza perfectamente con vs2008.

De todos modos, perdido en la oscuridad, convertí mi otro C++ lib, que se vincula con el proyecto CLI, también en un proyecto CLI (compilándolo con el indicador/clr). volver a vincular el proyecto CLI principal parece resolver el problema. De alguna manera, agregar el soporte clr o vincular con clr resuelve este tipo de colisión.

Si alguien tiene una explicación educada sobre este tema, me encantaría leerla.

1

Estaba enfrentando el mismo tipo de problema, pero más tarde descubrí que la clase que se muestra en el error se incluyó dos veces. Había almacenado el archivo de cabecera de mi clase principal en el directorio de mi proyecto con fines de copia de seguridad, y el original residía en la carpeta de inclusión de mi proyecto. Sucedió porque había incluido estas dos rutas de directorio en la propiedad "Incluir ruta de archivo de adición" de mi proyecto.

0
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> >): (0x0200004f). 
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). 

Este error aparece solo en la versión de depuración, es una especie de error del compilador. Para solucionarlo se puede cambiar la configuración

Configuration Properties\C/C++\Code Generation\Runtime Library 

proyecto desde

MultiThreaded Debug Dll (MDD) 

a MultiThreaded Dll (MD) (por DLL). Pero entonces tendrá problemas para depurar este código (por ejemplo, con puntos de interrupción)

Otra forma es deshacerse del uso de clases stl en código mixto: completamente en el proyecto, o en parte: divida su proyecto en nativo puro (con Stl classes) y partes mixtas, cree diferentes encabezados precompilados para ellos, apague/clr para todo el proyecto y enciéndalo solo para cpp con código mixto.

3

He resuelto este problema simplemente haciendo una "limpieza" en la solución general. Parece que esto simplemente puede suceder si VS mezcla las cosas.

0

En mi caso, una declaración de clase dependía de algunos #define declarados en .h (prueba #ifdef) que olvidé incluir en uno de los archivos que lo usaban. En resultado, el enlazador tenía 2 descripciones diferentes de la clase. En esta situación, compruebe todos los archivos que incluyen el archivo relacionado con la declaración condicional.

0

En uno de los proyectos dependientes stdafx.hy no contenían la siguiente declaración:

#ifndef WINVER   // Allow use of features specific to Windows XP or later. 
#define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows. 
#endif 

El resultado es diferente Prsht.h archivo de compilación en varios proyectos.

En este nombre de archivo se declara la estructura con _PROPSHEETPAGE.

VS 2008

-1

Yo también tuve este problema recientemente. Parece que antes de hacer una forma de trabajo, hice otra forma pero la eliminé. Pero de alguna manera uno de sus archivos .cpp se mantuvo. Hasta el momento en que lo noté, tuve este error. Una vez que eliminé el archivo .cpp del formulario eliminado, el problema desapareció.