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

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

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).

我们正在Windows7中使用Visual Studio 2010。
这个项目以前是编译的。它是围绕一些非托管代码的C++/CLI DLL包装器,因此包括公共语言运行库支持。改变的是我们链接到的外部静态库被“更新”。当我们试图编译链接到它的项目时,我们现在得到了这个错误。
对于这个问题,微软的“帮助”是“在对象文件上运行ildasm——令牌,以找出哪些类型的令牌在错误消息中列出,并寻找差异”。然后我检查了this page并注意到/tokens选项只对.exe和.dll文件有效…但这是一个链接器错误,因此尚未生成.dll文件!
我尝试过运行类似ildasm -tokens AssemblyInfo.obj的操作,但唯一发生的事情是窗口打开时显示了一条非常有用的错误消息:
感谢微软!
我真的不知道如何继续解决这个问题。一个版本构建工作正常——只是调试出了问题。所以在混音的某个地方,我猜std::string的类型是不同的大小或是什么…
有什么想法吗?


最佳答案:

好吧,所以我解决了!有一个很大的帮助。它最终链接到了another SO question,后者对这个问题有了更多的详细信息。基本上,在托管和非托管代码中编译标准库字符串是一个问题。解决方案是只在需要它的文件上启用clr。具体来说,我是这样做的:
移除了适用于整个项目的/clr开关
选择实际需要clr的两个.cpp文件,并在/clr下手动选择C/C++ -> General -> Common Language RunTime Support
将整个项目从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的文件上的一系列调试选项。具体来说,在C/C++ -> Code Generation下,我将Enable Minimal Rebuild设置为No (/RM-),并将Basic Runtime Checks设置为Default。这也消除了许多警告。
在调试和发布版本中,在启用了Enable C++ Exceptions的文件上将No设置为clr
希望这有帮助!