У меня есть код CLI, обертывающий C ++ DLL.
Когда я пытаюсь скомпилировать его в режиме отладки, я получаю следующую ошибку:
Ошибка 22 Ошибка LNK2022: операция метаданныхошибка (8013118D):
Непоследовательная информация о макете, предполагаемые типы .... MSVCMRTD.lib (locale0_implib.obj)
Странная вещь в том, что в режиме Release он компилируется и работаетОК.
Единственное различие, которое я вижу, которое вызывает проблему, это когда я меняю:
Свойства конфигурации -> C / C ++ -> Генерация кода -> Библиотека времени выполнения
Когда установлено: Multi-threaded Debug DLL (/MDd)
выдает ошибку.
Когда установлено: Multi-threaded DLL (/MD)
хорошо компилируется.
Те же настройки работают для всех остальных библиотек DLL в проекте (CLI и C ++), и они наследуют одни и те же свойства.
Я использую VS2010.
Итак, как я могу решить эту проблему?
И могу ли я получить какое-то объяснениеПОЧЕМУ это происходит?
Обновление:
Я в основном пыталсябезуспешно меняя каждую опцию в свойствах проекта.
Я где-то читал, что это может быть вызвано дублирующими объявлениями типа с одинаковым именем.
Но в файле CLI я вызываюstd :: string и т. д. явно из std.
- Переименование объектов не сработало
Есть другие идеи?
Обновление:
Несколько копий ошибок:
error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std._String_val<char,std::allocator<char> >): (0x02000097). E:\MyProject....\MSVCMRTD.lib(locale0_implib.obj) DllName
error LNK2022: metadata operation failed (8013118D) : Inconsistent layout information in duplicated types (std._String_iterator<char,std::char_traits<char>,std::allocator<char> >): (0x02000091). E:\MyProject....\MSVCMRTD.lib(locale0_implib.obj) AnotherDllName
Обратите внимание, что файл MSVCMRTD.lib на самом деле является файлом MS, используемым для компиляции, и нена самом деле в моем проекте (и не должно быть)
Обновление
Если вам это помогает, вот командная строка компоновщика:
/ OUT: "E: \ blah.CLI.dll" / INCREMENTAL / NOLOGO / LIBPATH: "e: \ blah \ Output \" / LIBPATH: "E: \ blah \ lib_64" / LIBPATH: "blah \ Lib_64 \" / DLL "e: \ Otheblaf.lib "/ MANIFEST /ManifestFile:"x64\Debug\blah.CLI.dll.intermediate.manifest" / ALLOWISOLATION / MANIFESTUAC: "level =" asInvoker 'uiAccess =' false '"/ DEBUG / PDB:"E: \ blah.CLI.pdb "/ SUBSYSTEM: WINDOWS / OPT: NOREF / OPT: NOICF /PGD:"E:\blah.CLI.pgd "/ TLBID: 1 / DYNAMICBASE: NO / FIXED: NO / MACHINE: X64 / ERRORREPORT: QUEUE
И выпуск, который работает:
/ OUT: "E: \ blah.CLI.dll" / ДОПОЛНИТЕЛЬНО: НЕТ / NOLOGO / LIBPATH: "E: \ blah \" / LIBPATH: "E: \ blah \ Output \" / LIBPATH: "E: \ blah \ lib_64" / DLL "Configuration.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib "" advapi32.lib "" shell32.lib "" ole32.lib "" oleaut32.lib "" uuid.lib "" odbc32.lib "" odbccp32.lib "" E: \ blah.lib "/ MANIFEST / ManifestFile: "blah.CLI.dll.intermediate.manifest" / ALLOWISOLATION / MANIFESTUAC: "level = 'asInvoker' uiAccess = 'false'" / DEBUG /PDB:"E:\blah.CLI.pdb "/ SUBSYSTEM: WINDOWS / OPT: REF / OPT: ICF /PGD:"E:\blah.CLI.pgd "/ LTCG / TLBID: 1 / DYNAMICBASE / FIXED: NO / MACHINE: X64 / ERRORREPORT: QUEUE