Ошибка LNK2022 при использовании / clr - PullRequest
8 голосов
/ 11 октября 2010

У меня проблема с подключением проекта C ++ в VS2008 при использовании опции компиляции /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

Понятия не имею, на что ссылаются PROPSHEETPAGEA и PROPSHEETPAGEW. Я проверил онлайн, чтобы увидеть описание ошибки Microsoft, но затрудняюсь понять, что это означает. http://support.microsoft.com/kb/324088

Чтобы решить эту проблему, добавьте уникальные идентификаторы при использовании Managed Extensions для C ++, чтобы избежать использования анонимных структур в качестве глобальных переменных.

Microsoft подтвердила, что это ошибка в продуктах Microsoft, перечисленных в начале этой статьи. Эта ошибка была исправлена ​​в Microsoft Visual C ++ .NET (2003).

Любые идеи будут с благодарностью.

EDIT

После выполнения ildasm на Class1.obj я извлек два сообщения:

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

Я не уверен, что все это значит, но похоже, что вторая запись идентична первой, за исключением атрибутов, определяемых в обратном порядке.

Ответы [ 9 ]

5 голосов
/ 20 августа 2012

Я решил эту проблему, просто выполнив «чистую» обработку всего решения. Кажется, это может произойти, если VS все перемешает.

4 голосов
/ 17 декабря 2010

У меня была точно такая же проблема сегодня на одном из моих проектов.Я решил это, переставив мои файлы заголовков.Проблема была в том, что я переместил файл заголовка в верхнюю часть файла cpp, до файла, который включал в себя windows.h.Итак, как только я вернул порядок включения и поместил windows.h обратно в верхнюю часть файла cpp, он все исправил.

очень странное исправление, но у меня это сработало.

1 голос
/ 05 августа 2011

Я столкнулся с такой же проблемой, но позже я обнаружил, что класс, который был показан в ошибке, был включен дважды.Я сохранил мой заголовочный файл основного класса в каталоге проекта для целей резервного копирования, а исходный находился в папке include моего проекта.Это произошло потому, что я включил эти два пути к каталогам в свойство «Включить путь к файлу добавления» моего проекта.

1 голос
/ 19 января 2011

У меня была такая же проблема сегодня, при переносе моего проекта с vs2008 на vs2010.При компиляции проекта CLI, который связывается с другими библиотеками C ++, я получил эту ошибку ссылки:

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

Я пробовал ildasm, как предлагается в документации, но не смог найти ни одного определения типа, которое кажется таким же, но имеющееразные имена.

Более того, я должен сказать, что не до конца понимаю эту ошибку.Появление двух ошибок означает, что есть две разные проблемы с обоими типами (строка символов и строка wchar), или это означает, что существует одна проблема, вызывающая эти два типа.Каково значение чисел в конце строки (хотя я нашел два определения типа в журнале ildasm с этими числами).В документации ничего об этом нет.

Кстати - те же проекты - одна и та же конфигурация компилируется и прекрасно связывается с vs2008.связать с проектом CLI, а также с проектом CLI (скомпилировать его с флагом / clr).перепроверка основного проекта CLI, кажется, решает проблему.Каким-то образом добавление поддержки clr или связывание с clr разрешают конфликты этого типа.

Если у кого-то есть грамотное объяснение этой проблемы, я бы с удовольствием его прочитал.

1 голос
/ 12 октября 2010

Похоже, вы делаете что-то вроде этого:

struct
{
    int a;
    int b;
} global_struct;

, что является анонимным.Если вы измените его на:

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

, это должно исправить ошибки.

0 голосов
/ 23 июня 2015

У меня тоже недавно была эта проблема. Кажется, что прежде чем я создал свою рабочую форму, я создал другую форму, но удалил ее. Но так или иначе один из его .cpp файла остался. До того момента, как я это заметил, у меня была эта ошибка. Как только я удалил .cpp файл из удаленной формы, проблема исчезла.

0 голосов
/ 10 октября 2013

В одном из зависимых проектов stdafx.h не содержал следующую декларацию:

#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

В результате получается разный файл компиляции prsht.h в разных проектах.

В этом файлеимя объявляется структурой с _PROPSHEETPAGE.

VS 2008

0 голосов
/ 06 декабря 2012

В моем случае одно объявление класса зависело от некоторого #define, объявленного в .h (тестирование #ifdef), которое я забыл включить в один из файлов, использующих его. В результате компоновщик получил 2 разных описания класса. В этой ситуации проверьте все файлы, которые включают связанный файл с условным объявлением.

0 голосов
/ 06 декабря 2011
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).

Эта ошибка появляется только в отладочной версии, это какая-то ошибка компилятора. Чтобы исправить это, вы можете переключить настройку проекта

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

от

MultiThreaded Debug Dll (MDD)

до MultiThreaded Dll (MD) (для DLL). Но тогда у вас будут проблемы с отладкой этого кода (например, с точками останова)

Другой способ - избавиться от использования классов stl в смешанном коде: полностью в проекте или частично: разделить ваш проект на чисто нативные (с классами Stl) и смешанные части, создать для них разные предварительно скомпилированные заголовки, отключить / clr для всего проекта и включать его только для cpp со смешанным кодом.

...