Ошибка LNK2022 при использовании /clr

У меня возникла проблема со связыванием проекта 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

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

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

Любые идеи очень приветствуются.

ИЗМЕНИТЬ

После выполнения 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)

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


person lumberjack4    schedule 11.10.2010    source источник
comment
Я изменил настройку своего решения, чтобы разместить весь управляемый код в одном проекте, а не в нескольких проектах, и ошибка исчезла. Это навсегда останется загадкой...   -  person lumberjack4    schedule 12.10.2010
comment
docs.microsoft.com/en-us/cpp/error-messages/tool-errors/ Я нашел это полезным   -  person Shantanu Methikar    schedule 25.09.2020


Ответы (9)


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

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

person C Johnson    schedule 17.12.2010
comment
Вот ссылка на MSDN, которая объясняет, что происходит. msdn.microsoft.com/en-us/library/aa712965 (VS.71).aspx - person C Johnson; 17.12.2010

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

person user1603061    schedule 20.08.2012

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

struct
{
    int a;
    int b;
} global_struct;

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

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

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

person Mark B    schedule 11.10.2010
comment
PROPSHEETPAGEA и PROPSHEETPAGEW — это структуры Windows. Мне кажется, что заголовок, в котором определены эти структуры (prsht.h), плохо работает в проектах на основе CLR. Есть ли шанс, что этот заголовок будет включен, когда в этом нет необходимости? Возможно, вам придется реорганизовать код, чтобы исключить из вашего решения заголовки, которые не нужны проекту. - person Matt Davis; 12.10.2010

Сегодня у меня была такая же проблема, когда я перенес свой проект с 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, как предлагает документация, но не смог найти никаких определений типов, которые кажутся одинаковыми, но имеют разные имена.

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

Кстати, те же проекты, та же конфигурация прекрасно компилируется и линкуется с vs2008.

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

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

person G.C.    schedule 19.01.2011

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

person Chirag    schedule 05.08.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 со смешанным кодом.

person Choufler    schedule 06.12.2011

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

person Dmitry Prihodko    schedule 06.12.2012

В одном из зависимых проектов 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

person Mikhael    schedule 09.10.2013

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

person yash upadhyay    schedule 22.06.2015