首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >LNK2022元数据操作:重复类型中不一致的布局信息

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

Stack Overflow用户
提问于 2012-08-16 15:01:35
回答 3查看 20.8K关注 0票数 16

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

代码语言:javascript
运行
复制
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的类型是不同的大小或什么的.

有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-16 16:05:44

好吧,所以我解决了!另一个这样的问题确实帮了大忙。它最终链接到这篇文章,后者对这个问题有了更多的细节。基本上,这是在托管和非托管代码中编译的标准库字符串的一些问题。解决方案是只对需要CLR的文件启用CLR。详细地说,以下是我所做的:

  1. 删除应用于整个项目的/clr开关
  2. 选择实际需要CLR的两个.cpp文件,并在C/C++ -> General -> Common Language RunTime Support下手动选择/clr
  3. 将整个项目从Program Database for Edit and Continue /ZI切换到Program Database for Edit and Continue /ZI。这消除了警告,因为我认为/clr支持似乎禁用增量链接,然后我的本机代码抛出警告,因为它试图使用编辑和继续。
  4. 然后,我得到了一些ExtensionAttribute警告,我通过在/clr-enabled文件中添加以下开关来修正这些警告:/clr:nostdlib /AI"%ProgramFiles%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
  5. 在Debug构建中,我不得不禁用/clr-enabled文件上的一系列调试选项。具体来说,在C/C++ -> Code Generation下,我将Enable Minimal Rebuild设置为No (/RM-),将Basic Runtime Checks设置为Default。这也消除了一堆警告。
  6. 在调试和发布版本中,将Enable C++ Exceptions设置为clr-enabled文件上的-enabled。

希望这能有所帮助!

票数 17
EN

Stack Overflow用户

发布于 2014-12-09 14:53:26

我的似乎处于某种故障状态。只有我一个人犯了这个错误。我没有任何变化。我重新检查了旁边的那个项目,它已经修好了。也许是我的用户文件出了问题。

票数 2
EN

Stack Overflow用户

发布于 2015-11-30 22:13:06

我的修正是设置配置属性-> C/C++ ->代码生成->结构成员对齐方式-> 16字节(/Zp16)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11990095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档