16

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

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 中列出的令牌,并查找差异”。然后我检查了这个页面,发现该/tokens选项只对 .exe 和 .dll 文件有效……但这是一个链接器错误,所以我的 .dll 文件还没有生成!

我试过运行类似的东西ildasm -tokens AssemblyInfo.obj,但唯一发生的事情是一个窗口打开了这个非常有用的错误消息:

感谢微软

感谢微软!

我不确定如何继续解决此问题。Release 构建工作正常——只有 Debug 搞砸了。所以在混合的某个地方,我猜std::string类型是不同的大小或什么的......

有任何想法吗?

4

3 回答 3

17

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

  1. 删除了/clr适用于整个项目的开关
  2. .cpp选择了实际需要CLR的两个文件,/clrC/C++ -> General -> Common Language RunTime Support.
  3. 将整个项目Program Database /ZiProgram Database for Edit and Continue /ZI. 这消除了警告,因为我认为/clr支持似乎禁用了增量链接,然后我的本机代码抛出警告,因为它试图使用编辑并继续。
  4. 然后我收到了一些ExtensionAttribute警告,我通过在我的/clr启用文件中添加以下开关来修复这些警告:/clr:nostdlib /AI"%ProgramFiles%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
  5. 在 Debug 版本中,我不得不禁用/clr-enabled 文件上的一堆调试选项。具体来说,在 下,C/C++ -> Code Generation我设置Enable Minimal RebuildNo (/RM-)Basic Runtime ChecksDefault这也摆脱了一堆警告。
  6. 在 Debug and Release 版本中,设置Enable C++ ExceptionsNoon the clr-enabled 文件。

希望这可以帮助!

于 2012-08-16T16:05:44.417 回答
2

好像我的 Visual Studio 处于某种损坏状态。我是唯一一个得到这个错误的人。我没有任何变化。我重新检查了旁边的项目,它是固定的。也许这是我的用户文件的问题。

于 2014-12-09T14:53:26.933 回答
2

我的解决方法是设置配置属性 -> C/C++ -> 代码生成 -> 结构成员对齐 -> 16 字节 (/Zp16)

于 2015-11-30T22:13:06.220 回答