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 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:
/clr
switch which applied to the whole project
.cpp
files that actually required the CLR, and manually selected /clr
under C/C++ -> General -> Common Language RunTime Support
.Program Database /Zi
from Program 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.ExtensionAttribute
warnings, which I fixed by adding the following switches to my /clr
-enabled files: /clr:nostdlib /AI"%ProgramFiles%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
/clr
-enabled files. Specifically, under C/C++ -> Code Generation
, I set Enable Minimal Rebuild
to No (/RM-)
, and Basic Runtime Checks
to Default
. This got rid of a bunch of warnings also.Enable C++ Exceptions
to No
on the clr
-enabled files.Hope this helps!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With