我在处理一个项目时遇到了一个新的连接器错误:
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
之类的命令,但唯一发生的事情就是打开一个窗口,显示这个极其有用的错误消息:
感谢微软!
我不太确定如何继续解决这个问题。一个发布版本能正常工作——只有调试版本出了问题。所以我猜测在某个地方,std::string
类型的大小或者其他什么东西发生了变化……
有任何想法吗?