在我正在处理的一个项目中,我遇到了一个新的链接器错误:
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 2010。
这个项目过去经常编译。它是一些非托管代码的C++/CLI DLL包装器,因此包括公共语言运行时支持。改变了的是,我们链接到的外部静态库被“更新”了。现在,当我们试图编译链接到它的项目时,我们得到了这个错误。
Microsoft对此问题的“帮助”是“在对象文件上运行ildasm -tokens,以查找哪些类型具有error_message中列出的令牌,并查找差异”。然后我检查了此页并注意到/tokens
选项只对.exe和.dll文件有效.但是这是一个链接错误,所以我的.dll文件还没有生成!
我尝试过运行像ildasm -tokens AssemblyInfo.obj
这样的程序,但是唯一发生的事情就是打开了一个窗口,其中包含了一条非常有用的错误消息:
谢谢微软!
我不太确定如何继续解决这个问题。发行版构建工作正常--只有调试失败了。所以在混合的某个地方,我猜std::string
的类型是不同的大小或什么的.
有什么想法吗?
发布于 2012-08-16 16:05:44
好吧,所以我解决了!另一个这样的问题确实帮了大忙。它最终链接到这篇文章,后者对这个问题有了更多的细节。基本上,这是在托管和非托管代码中编译的标准库字符串的一些问题。解决方案是只对需要CLR的文件启用CLR。详细地说,以下是我所做的:
/clr
开关.cpp
文件,并在C/C++ -> General -> Common Language RunTime Support
下手动选择/clr
。Program Database for Edit and Continue /ZI
切换到Program Database for Edit and Continue /ZI
。这消除了警告,因为我认为/clr
支持似乎禁用增量链接,然后我的本机代码抛出警告,因为它试图使用编辑和继续。ExtensionAttribute
警告,我通过在/clr
-enabled文件中添加以下开关来修正这些警告:/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
-enabled文件上的-enabled。希望这能有所帮助!
发布于 2014-12-09 14:53:26
我的似乎处于某种故障状态。只有我一个人犯了这个错误。我没有任何变化。我重新检查了旁边的那个项目,它已经修好了。也许是我的用户文件出了问题。
发布于 2015-11-30 22:13:06
我的修正是设置配置属性-> C/C++ ->代码生成->结构成员对齐方式-> 16字节(/Zp16)
https://stackoverflow.com/questions/11990095
复制相似问题