Подтвердить что ты не робот

Операция метаданных LNK2022: несогласованная информация о расположении в дублированных типах

В проекте, с которым я работаю, возникает новая ошибка компоновщика:

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

Мы используем Visual Studio 2010 в Windows 7.

Этот проект использовался для компиляции. Это оболочка С++/CLI DLL вокруг некоторого неуправляемого кода и, таким образом, включает в себя поддержку Common Language Runtime. Вещь с измененной заключается в том, что внешняя статическая библиотека, с которой мы связаны, была "обновлена". Мы получаем эту ошибку, когда пытаемся скомпилировать проект, который ссылается на него.

Microsoft "help" для этой проблемы заключается в том, чтобы "запустить ildasm -tokens в объектных файлах, чтобы определить, какие типы имеют маркеры, перечисленные в error_message, и искать различия". Затем я проверил эту страницу и заметил, что параметр /tokens действителен только для файлов .exe и .dll... но это компоновщик ошибка, поэтому мой. DLL файл еще не создан!

Я попытался запустить такие вещи, как ildasm -tokens AssemblyInfo.obj, но единственное, что происходит, это то, что окно открывается с этим невероятно полезным сообщением об ошибке:

Thanks Microsoft

Спасибо Microsoft!

Я не уверен, как продолжить устранение этой проблемы. Выпуск сборки работает правильно - это только отладка, которая перепуталась. Поэтому где-то в миксе я предполагаю, что тип std::string имеет другой размер или что-то еще...

Любые идеи?

4b9b3361

Ответ 1

Хорошо, поэтому я решил это! Был другой вопрос SO, который на самом деле был большой помощью. В результате эта ссылка была связана с этой статьей, в которой было немного более подробно о проблеме. В основном это проблема со стандартными библиотечными строками, скомпилированными как в управляемом, так и неуправляемом коде. Решение состояло в том, чтобы включить CLR только в файлы, которые этого требовали. В деталях, вот что я сделал:

  • Удален переключатель /clr, который применяется ко всему проекту
  • Выбрали два .cpp файла, которые действительно требовали CLR, и вручную выбрали /clr в разделе C/C++ -> General -> Common Language RunTime Support.
  • Переключил весь проект на Program Database /Zi с Program Database for Edit and Continue /ZI. Это избавило от предупреждений, потому что я думаю, что поддержка /clr отключила инкрементную привязку, а затем мой собственный код выдавал предупреждения, потому что он пытался использовать Edit и Continue.
  • Затем я получил несколько предупреждений ExtensionAttribute, которые я исправил, следуя инструкциям на этой странице, эффективно добавив следующие переключатели к моему /clr -enabled: /clr:nostdlib /AI"%ProgramFiles%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
  • В сборках Debug мне пришлось отключить кучу параметров отладки в файлах с /clr -enabled. В частности, под C/C++ -> Code Generation я установил Enable Minimal Rebuild в No (/RM-) и Basic Runtime Checks в Default. Это также избавило от кучи предупреждений.
  • В сборках отладки и выпуска установите Enable C++ Exceptions в No в файлах с clr -enabled.

Надеюсь, это поможет!

Ответ 2

Кажется, что моя Visual Studio была в некотором сломанном состоянии. Я был единственным, кто получил эту ошибку. У меня не было никаких изменений. Я перепроверил проект на стороне, и он был исправлен. Возможно, это была проблема с моими пользовательскими файлами.

Ответ 3

Исправление для меня состояло в том, чтобы установить Configuration Properties → C/С++ → Code Generation → Struct Member Alignment → 16 Bytes (/Zp16)