【问题标题】:LNK2022 metadata operation: Inconsistent layout information in duplicated typesLNK2022 元数据操作:重复类型中的布局信息不一致
【发布时间】:2012-08-12 23:24:52
【问题描述】:

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

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 包装器,因此包括公共语言运行时支持。 改变的是我们链接到的外部静态库被“更新”了。当我们尝试编译链接到它的项目时,我们现在遇到了这个错误。

Microsoft 对此问题的“帮助”是“在目标文件上运行 ildasm –tokens 以查找哪些类型具有 error_message 中列出的令牌,并查找差异”。然后我检查了this page,发现/tokens 选项只对.exe 和.dll 文件有效……但这是一个链接器错误,所以我的.dll 文件还没有生成!

我尝试过运行 ildasm -tokens AssemblyInfo.obj 之类的东西,但唯一发生的事情是打开一个窗口并显示以下非常有用的错误消息:

感谢微软!

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

有什么想法吗?

【问题讨论】:

  • 我有时会在更改头文件时收到此错误,并且编译器不会重新编译它应该重新编译的所有代码文件。您可能已经这样做了,但干净和完整的重建可能会有所帮助。
  • @DavidYaw 感谢您的建议——我一直在进行全面重建,但没有成功。我想我正在寻找一些东西......

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


【解决方案1】:

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

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

希望这会有所帮助!

【讨论】:

  • 我遇到了同样的问题,但在我的情况下,对 的引用也需要在托管文件中(除非我们更改 API)。有没有其他方法可以解决这个问题?
  • 我唯一可以推荐的是尝试通过使用动态链接库以某种方式拆分您的托管/非托管代码,也许?这恰好对我有用,但我不确定它的概括性如何......
  • 我已经这样做了(但这是一个很好的提示)。如您所见,我错误地将托管库链接到不需要的非托管库,从而不必要地导致了 LNK2022。
  • 这也是由于包含的#definesWINVER_WIN32_WINNT之间的差异造成的
  • @JohnGrabanski 删除了死链接...有点晚了。
【解决方案2】:

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

【讨论】:

  • 在我的情况下,我刚刚在 VS2013 中构建了 .vcxproj 到 VS2015。清理 -> 重建修复它。
【解决方案3】:

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

【讨论】:

  • 这个解决方案解决了我类似的问题,即重复类型中的字段声明不一致
猜你喜欢
  • 2018-01-12
  • 2023-03-16
  • 2011-02-21
  • 2023-03-26
  • 2016-07-10
  • 1970-01-01
  • 2016-09-21
  • 1970-01-01
  • 2018-11-02
相关资源
最近更新 更多