LNK2022元数据操作:重复类型中的布局信息不一致 [英] LNK2022 metadata operation: Inconsistent layout information in duplicated types
问题描述
我在我正在使用的项目中有一个新到我的链接器错误:
1> MSVCMRTD.lib(locale0_implib.obj):error LNK2022:元数据操作失败(8013118D):重复类型中的布局信息不一致(std.basic_string< char,std :: char_traits< char>,std :: allocator< char> :(0x0200004e)。
1> MSVCMRTD.lib(locale0_implib.obj):error LNK2022:元数据操作失败(8013118D):重复类型中的布局信息不一致(std.basic_string< wchar_t,std :: char_traits< wchar_t>,std :: allocator< ; wchar_t>>):(0x02000075)。
1> MSVCMRTD.lib(locale0_implib.obj):error LNK2022:元数据操作失败(8013118D):重复类型中的布局信息不一致(std._String_iterator< char,std :: char_traits< char>,std :: allocator< ; char>>):(0x02000091)。
1> MSVCMRTD.lib(locale0_implib.obj):error LNK2022:元数据操作失败(8013118D):重复类型中的布局信息不一致(std._String_const_iterator< char,std :: char_traits< char>,std :: allocator< ; char>>):(0x02000092)。
1> MSVCMRTD.lib(locale0_implib.obj):error LNK2022:元数据操作失败(8013118D):重复类型中的布局信息不一致(std._String_val< char,std :: allocator< char> 0x02000097)。
1> MSVCMRTD.lib(locale0_implib.obj):error LNK2022:元数据操作失败(8013118D):重复类型中的布局信息不一致(std._String_val< wchar_t,std :: allocator< wchar_t>>): 0x02000099)。
我们在Windows 7中使用Visual Studio 2010。
这个项目用于编译。它是一个C ++ / CLI DLL包装一些非托管代码,因此包括公共语言运行时支持。已更改 的是我们链接到的外部静态库更新。
这个问题的微软帮助是运行 ildasm - tokens ,以找到在error_message中列出的令牌并查找差异的类型。然后,我查看了,其中有一个更详细的问题。基本上,这是标准库字符串在管理和非托管代码编译的一些问题。解决方案是只对需要它的文件启用CLR。具体来说,这里是我做的:
- 删除了应用的
/ clr
到整个项目 - 选择两个实际需要CLR的
.cpp
文件,/ clr
在下C / C ++ - >一般 - >公共语言运行时支持
。 - 将整个项目切换到
Program Database / Zi
c>编辑数据库并继续/ ZI 。这摆脱了警告,因为我认为/ clr
支持似乎禁用增量链接,然后我的本机代码是引发警告,因为它试图使用编辑和继续。 / li>
- 然后我得到一些
ExtensionAttribute
警告,我按照此页面,有效添加以下开关到我的/ clr
-enabled文件:/ clr:nostdlib / AI%ProgramFiles%\Reference Assemblies\Microsoft\Framework\。 NETFramework \v4.0
- 在Debug版本中,我不得不禁用
/ clr
-enabled文件。具体来说,在
C / C ++ - >代码生成
,我将启用最小重建
设置为否(/ RM - )
基本运行时检查
到默认
。 - 在Debug和Release版本中,将
启用C ++异常
设置为p>希望这有助于!
I'm having a new-to-me linker error in a project I'm working with:
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).
We're using Visual Studio 2010 in Windows 7.
This project used to compile. It's a C++/CLI DLL wrapper around some unmanaged code, and thus includes Common Language Runtime Support. The thing that has changed is that an external static library that we linked to was "updated". We're now getting this error when we try to compile the project that links to it.
Microsoft's "help" for this issue is to "run ildasm –tokens on the object files to find which types have the tokens listed in error_message, and look for differences". Then I checked this page and noticed that the
/tokens
option is only valid for .exe and .dll files... but this is a linker error, so my .dll file isn't made yet!I've tried running things like
ildasm -tokens AssemblyInfo.obj
, but the only thing that happens is that a window opens up with this incredibly helpful error message:Thanks Microsoft!
I'm not really sure how to continue troubleshooting this issue. A Release build works properly -- it's only the Debug that's messed up. So somewhere in the mix I guess the
std::string
type is of a different size or something...Any ideas?
解决方案Alright, so I solved it! There was another SO question that was actually a big help. It ended up linking to the this article, which had a bit more detail about the problem. Basically it's some issue with the standard library strings getting compiled in both managed and unmanaged code. The solution was to only enable the CLR on files which required it. In detail, here's what I did:
- Removed the
/clr
switch which applied to the whole project - Selected the two
.cpp
files that actually required the CLR, and manually selected/clr
underC/C++ -> General -> Common Language RunTime Support
. - Switched the whole project to
Program Database /Zi
fromProgram Database for Edit and Continue /ZI
. This got rid of warnings, because I think/clr
support appeared to disable incremental linking, and then my native code was throwing warnings because it was trying to use Edit and Continue. - I then got some
ExtensionAttribute
warnings, which I fixed by following the instructions on this page, effectively adding the following switches to my/clr
-enabled files:/clr:nostdlib /AI"%ProgramFiles%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
- In Debug builds, I had to disable a bunch of debug options on the
/clr
-enabled files. Specifically, underC/C++ -> Code Generation
, I setEnable Minimal Rebuild
toNo (/RM-)
, andBasic Runtime Checks
toDefault
. This got rid of a bunch of warnings also. - In Debug and Release builds, set
Enable C++ Exceptions
toNo
on theclr
-enabled files.
Hope this helps!
这篇关于LNK2022元数据操作:重复类型中的布局信息不一致的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
- Removed the