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

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

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。

这个项目用来编译。 它是一些非托pipe代码的C ++ / CLI DLL封装,因此包含了公共语言运行时支持。 事情已经改变了,我们链接到一个外部静态库是“更新”。 当我们尝试编译链接到它的项目时,我们现在得到这个错误。

微软对这个问题的“帮助”是“在对象文件上运行ildasm -tokens来查找哪些types具有在error_message中列出的标记,并寻找差异”。 然后我检查了这个页面 ,发现/tokens选项只对.exe和.dll文件有效……但是这是一个链接器错误,所以我的.dll文件还没有制作完成!

我已经尝试了像ildasm -tokens AssemblyInfo.obj这样的东西,但唯一发生的事情就是打开一个窗口,这个令人难以置信的有用的错误信息:

感谢微软

感谢微软!

我不确定如何继续解决这个问题。 发布构build工作正常 – 这只是debugging搞砸了。 所以在混合的某个地方,我猜std::stringtypes是不同的大小或什么的…

有任何想法吗?

好吧,我解决了! 还有另外一个问题实际上是一个很大的帮助。 它结束了链接到这篇文章 ,有更多的细节问题。 基本上,这是标准库字符串在托管代码和非托管代码中编译时遇到的问题。 解决方案是只启用需要它的文件的CLR。 详细的,这是我做的:

  1. 删除了应用于整个项目/clr开关
  2. 选择实际需要CLR的两个.cpp文件,并在C/C++ -> General -> Common Language RunTime Support下手动选择/clr
  3. 将整个项目从Program Database for Edit and Continue /ZI切换到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"文件中: /clr:nostdlib /AI"%ProgramFiles%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
  5. 在调试版本中,我必须在/clr -enabled文件上禁用一堆调试选项。 具体来说,在C/C++ -> Code Generation ,我将Enable Minimal Rebuild设置为No (/RM-)Basic Runtime ChecksDefault 。 这也摆脱了一堆警告。
  6. 在Debug和Release版本中,在Enable C++ Exceptions clr文件上将Enable C++ Exceptions设置为No

希望这可以帮助!

看起来像我的Visual Studio处于一些破碎的状态。 我是唯一一个得到这个错误的人。 我没有改变。 我重新检查一边的项目,它是固定的。 也许这是我的用户文件的问题。

对我来说,修改是设置配置属性 – > C / C ++ – >代码生成 – >结构成员对齐 – > 16字节(/ Zp16)