在我正在使用的项目中,我遇到了一个新的链接器错误:
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).
我们在Windows 7中使用Visual Studio 2010。
这个项目用来编译。它是一些围绕某些非托管代码的C ++ / CLI DLL包装器,因此包括公共语言运行时支持。 已更改的内容是我们链接到的外部静态库已“更新”。当我们尝试编译链接到它的项目时,我们现在收到此错误。
微软对这个问题的“帮助”是“在目标文件上运行 ildasm -tokens ,以找到哪些类型的标记在error_message中列出,并查找差异”。然后我检查this page并注意到/tokens
选项仅对.exe和.dll文件有效...但这是一个链接器错误,因此我的.dll文件尚未生成!< / p>
我已尝试运行ildasm -tokens AssemblyInfo.obj
之类的内容,但唯一发生的事情是打开一个窗口,其中包含以下非常有用的错误消息:
感谢微软!
我不确定如何继续解决此问题。 Release版本正常运行 - 它只是Debug乱搞了。所以在混合的某个地方,我猜std::string
类型的大小不同......或者其他......
有什么想法吗?
答案 0 :(得分:14)
好吧,所以我解决了!有another SO question实际上是一个很大的帮助。它最终链接到this article,其中有关于该问题的更多细节。基本上,标准库字符串在托管代码和非托管代码中编译时存在一些问题。解决方案是仅对需要它的文件启用CLR。详细而言,这就是我所做的:
/clr
开关 .cpp
文件,并在/clr
下手动选择了C/C++ -> General -> Common Language RunTime Support
。Program Database /Zi
切换到Program Database for Edit and Continue /ZI
。这消除了警告,因为我认为/clr
支持似乎禁用增量链接,然后我的本机代码抛出警告,因为它试图使用编辑并继续。ExtensionAttribute
警告,我通过将以下开关添加到我的/clr
启用的文件中来修复:/clr:nostdlib /AI"%ProgramFiles%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
/clr
启用的文件上禁用一堆调试选项。具体而言,在C/C++ -> Code Generation
下,我将Enable Minimal Rebuild
设置为No (/RM-)
,将Basic Runtime Checks
设置为Default
。这也消除了一堆警告。Enable C++ Exceptions
启用的文件上将No
设置为clr
。希望这有帮助!
答案 1 :(得分:2)
好像我的Visual Studio处于某种破碎状态。我是唯一一个得到这个错误的人。 我没有变化。 我重新检查了侧面的项目,并修复了它。 也许这是我的用户文件的问题。
答案 2 :(得分:1)
我的修复是设置配置属性 - &gt; C / C ++ - &gt;代码生成 - &gt;结构成员对齐 - &gt; 16字节(/ Zp16)