我正在使用的项目中遇到了新的链接器错误:
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::string
types是不同的大小或什么的…
有任何想法吗?
好吧,我解决了! 还有另外一个问题实际上是一个很大的帮助。 它结束了链接到这篇文章 ,有更多的细节问题。 基本上,这是标准库字符串在托管代码和非托管代码中编译时遇到的问题。 解决方案是只启用需要它的文件的CLR。 详细的,这是我做的:
/clr
开关 .cpp
文件,并在C/C++ -> General -> Common Language RunTime Support
下手动选择/clr
。 Program Database for Edit and Continue /ZI
切换到Program Database /Zi
Program Database for Edit and Continue /ZI
。 这摆脱了警告,因为我认为/clr
支持似乎禁用增量链接,然后我的本机代码抛出警告,因为它试图使用编辑和继续。 ExtensionAttribute
警告,我按照本页上的说明修复了这些警告,并有效地将下列开关添加到了我的/clr
/clr:nostdlib /AI"%ProgramFiles%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
文件中: /clr:nostdlib /AI"%ProgramFiles%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
/clr
-enabled文件上禁用一堆调试选项。 具体来说,在C/C++ -> Code Generation
,我将Enable Minimal Rebuild
设置为No (/RM-)
, Basic Runtime Checks
为Default
。 这也摆脱了一堆警告。 Enable C++ Exceptions
clr
文件上将Enable C++ Exceptions
设置为No
希望这可以帮助!
看起来像我的Visual Studio处于一些破碎的状态。 我是唯一一个得到这个错误的人。 我没有改变。 我重新检查一边的项目,它是固定的。 也许这是我的用户文件的问题。
对我来说,修改是设置配置属性 – > C / C ++ – >代码生成 – >结构成员对齐 – > 16字节(/ Zp16)