Операция метаданных 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
имеет другой размер или что-то еще...
Любые идеи?
Ответы
Ответ 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)