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

问题描述 投票:14回答:3

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

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文件还没有制作!

我已经尝试过运行像ildasm -tokens AssemblyInfo.obj这样的东西,但唯一发生的事情就是打开一个窗口,显示这个非常有用的错误消息:

谢谢微软!

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

有任何想法吗?

c++ windows linker c++-cli clr
3个回答
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. 在Debug和Release版本中,在启用Enable C++ Exceptions的文件上将No设置为clr

希望这可以帮助!


2
投票

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.