LNK2022元数据操作:重复类型中的布局信息不一致

时间:2012-08-16 15:01:35

标签: c++ windows linker c++-cli clr

在我正在使用的项目中,我遇到了一个新的链接器错误:

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之类的内容,但唯一发生的事情是打开一个窗口,其中包含以下非常有用的错误消息:

Thanks Microsoft

感谢微软!

我不确定如何继续解决此问题。 Release版本正常运行 - 它只是Debug乱搞了。所以在混合的某个地方,我猜std::string类型的大小不同......或者其他......

有什么想法吗?

3 个答案:

答案 0 :(得分:14)

好吧,所以我解决了!有another SO question实际上是一个很大的帮助。它最终链接到this article,其中有关于该问题的更多细节。基本上,标准库字符串在托管代码和非托管代码中编译时存在一些问题。解决方案是仅对需要它的文件启用CLR。详细而言,这就是我所做的:

  1. 删除了应用于整个项目的/clr开关
  2. 选择了实际需要CLR的两个.cpp文件,并在/clr下手动选择了C/C++ -> General -> Common Language RunTime Support
  3. 将整个项目从Program Database /Zi切换到Program Database for Edit and Continue /ZI。这消除了警告,因为我认为/clr支持似乎禁用增量链接,然后我的本机代码抛出警告,因为它试图使用编辑并继续。
  4. 然后我收到了一些ExtensionAttribute警告,我通过将以下开关添加到我的/clr启用的文件中来修复:/clr:nostdlib /AI"%ProgramFiles%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
  5. 在Debug版本中,我必须在/clr启用的文件上禁用一堆调试选项。具体而言,在C/C++ -> Code Generation下,我将Enable Minimal Rebuild设置为No (/RM-),将Basic Runtime Checks设置为Default。这也消除了一堆警告。
  6. 在调试和发布版本中,在Enable C++ Exceptions启用的文件上将No设置为clr
  7. 希望这有帮助!

答案 1 :(得分:2)

好像我的Visual Studio处于某种破碎状态。我是唯一一个得到这个错误的人。 我没有变化。 我重新检查了侧面的项目,并修复了它。 也许这是我的用户文件的问题。

答案 2 :(得分:1)

我的修复是设置配置属性 - &gt; C / C ++ - &gt;代码生成 - &gt;结构成员对齐 - &gt; 16字节(/ Zp16)