【发布时间】:2011-06-18 01:14:13
【问题描述】:
我有一个包装 C++ DLL 的 CLI 代码。
当我尝试在调试模式下编译它时,我收到以下错误:
错误 22 错误 LNK2022:元数据操作失败 (8013118D):
布局信息不一致导致类型重复 .... MSVCMRTD.lib (locale0_implib.obj)
奇怪的是,在发布模式下它编译正常并且工作正常。
我能看到导致问题的唯一区别是当我改变时:
配置属性 -> C/C++ -> 代码生成 -> 运行时库
当它设置为:Multi-threaded Debug DLL (/MDd) 时,它会引发错误。
当它设置为:Multi-threaded DLL (/MD) 时,它编译得很好。
相同的设置适用于项目中的所有其他 DLL(CLI 和 C++),并且它们继承相同的属性。
我正在使用 VS2010。
那么,我该如何解决呢?
我能解释一下为什么会这样吗?
更新:
我基本上尝试过更改项目属性中的每个选项,但没有成功。
我在某处读到这可能是由同名类型的重复声明引起的。
但在 CLI 文件中,我从 std 显式调用 std::string 等。
- 重命名对象不起作用
还有其他想法吗?
更新:
一些错误的复制粘贴:
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”/清单 /ManifestFile:"x64\Debug\blah.CLI.dll.intermediate.manifest" /允许隔离 /MANIFESTUAC:"level='asInvoker' uiAccess='假'" /DEBUG /PDB:"E:\blah.CLI.pdb" /子系统:WINDOWS /OPT:NOREF /OPT:NOICF /PGD:"E:\blah.CLI.pgd" /TLBID:1 /DYNAMICBASE:NO /FIXED:NO /机器:X64 /错误报告:队列
以及有效的版本:
/OUT:"E:\blah.CLI.dll" /INCREMENTAL:NO /NOLOGO /LIBPATH:"E:\blah\" /LIBPATH:"E:\blah\输出\" /LIBPATH:"E:\blah\lib_64" /DLL “配置.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”/清单 /ManifestFile:"blah.CLI.dll.intermediate.manifest" /允许隔离 /MANIFESTUAC:"level='asInvoker' uiAccess='假'" /DEBUG /PDB:"E:\blah.CLI.pdb" /子系统:WINDOWS /OPT:REF /OPT:ICF /PGD:"E:\blah.CLI.pgd" /LTCG /TLBID:1 /DYNAMICBASE /FIXED:NO /MACHINE:X64 /错误报告:队列
【问题讨论】:
-
你已经问过这个了,确切同样的问题。从那以后你肯定发现了别的东西吗?
-
不,没有任何答案,我想我会重新提出这个问题。我还没有找到解决办法。 (并且“只需使用 /MD 就可以编译”)不是答案。
-
这个答案有帮助吗? stackoverflow.com/questions/810827/… - 我正在努力寻找从哪里开始。
-
我试过删除“增量构建”...没有用。谢谢
-
这是另一个处理几乎相同问题的 SO 帖子:stackoverflow.com/questions/3909470/…,也许那里的答案会对您有所帮助。
标签: compiler-construction linker c++-cli clr linker-errors