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

C++ LNK2022元数据操作:重复类型中的布局信息不一致,c++,windows,linker,c++-cli,clr,C++,Windows,Linker,C++ Cli,Clr,在我正在处理的项目中,我有一个新的“给我”链接器错误: 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<cha

在我正在处理的项目中,我有一个新的“给我”链接器错误:

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).
1>MSVCMRTD.lib(locale0_implib.obj):错误LNK2022:元数据操作失败(8013118D):重复类型中的布局信息不一致(std.basic_字符串):(0x0200004e)。
1> MSVCMRTD.lib(locale0_implib.obj):错误LNK2022:元数据操作失败(8013118D):重复类型中的布局信息不一致(std.basic_字符串):(0x02000075)。
1> MSVCMRTD.lib(locale0_implib.obj):错误LNK2022:元数据操作失败(8013118D):重复类型中的布局信息不一致(标准字符串迭代器):(0x02000091)。
1> MSVCMRTD.lib(locale0_implib.obj):错误LNK2022:元数据操作失败(8013118D):重复类型中的布局信息不一致(标准字符串常量迭代器):(0x02000092)。
1> MSVCMRTD.lib(locale0_implib.obj):错误LNK2022:元数据操作失败(8013118D):重复类型中的布局信息不一致(标准字符串值):(0x02000097)。
1> MSVCMRTD.lib(locale0_implib.obj):错误LNK2022:元数据操作失败(8013118D):重复类型中的布局信息不一致(标准字符串值):(0x02000099)。
我们正在Windows7中使用VisualStudio2010

这个项目过去是用来编译的。它是围绕一些非托管代码的C++/CLI DLL包装,因此包含公共语言运行时支持。改变的事情是,我们链接到的外部静态库被“更新”。当我们试图编译链接到它的项目时,我们现在遇到了这个错误

Microsoft对此问题的“帮助”是“在对象文件上运行ildasm–令牌,查找哪些类型的令牌列在错误消息中,并查找差异”。然后我检查并注意到
/tokens
选项仅对.exe和.dll文件有效。。。但是这是一个链接器错误,所以我的.dll文件还没有生成

我试过运行类似于
ildasm-tokens AssemblyInfo.obj
的东西,但唯一发生的事情是打开一个窗口,其中显示了一条非常有用的错误消息:

谢谢微软

我不确定如何继续解决此问题。发布版本正常工作——只有调试出错。因此,我猜在组合中的某个地方,
std::string
类型的大小不同或是其他什么


有什么想法吗?

好吧,我解决了!这实际上是一个很大的帮助。它最终链接到了,其中有关于问题的更多细节。基本上,在托管代码和非托管代码中编译标准库字符串都存在一些问题。解决方案是只在需要的文件上启用CLR。具体来说,我是这样做的:

  • 删除了应用于整个项目的
    /clr
    开关
  • 选择实际需要CLR的两个
    .cpp
    文件,并在
    C/C++->General->Common Language RunTime Support
    下手动选择
    /CLR
  • 将整个项目从
    程序数据库切换到
    程序数据库/Zi
    ,以进行编辑和继续/Zi
    。这消除了警告,因为我认为
    /clr
    支持似乎禁用了增量链接,然后我的本机代码抛出警告,因为它试图使用“编辑并继续”
  • 然后我得到了一些
    ExtensionAttribute
    警告,我通过在启用
    /clr
    的文件中添加以下开关来修复这些警告:
    /clr:nostlib/AI”%ProgramFiles%\Reference Assemblys\Microsoft\Framework\.NETFramework\v4.0“
  • 在调试版本中,我必须在启用了
    /clr
    的文件上禁用一系列调试选项。具体地说,在
    C/C++->代码生成
    下,我将
    启用最小重建
    设置为
    否(/RM-
    ),并将
    基本运行时检查
    设置为
    默认值
    。这也消除了一堆警告
  • 在调试和发布版本中,在<<代码> CLR< /COD>启用文件中设置<代码>使C++异常> <代码> >代码> NO> <代码> .<
    希望这有帮助

    我的Visual Studio似乎处于某种崩溃状态。我是唯一一个犯这个错误的人。 我没有变化。 我从侧面重新检查了这个项目,它被修复了。
    可能是我的用户文件有问题。

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

    我有时在更改头文件时会出现此错误,编译器不会重新编译它应该编译的所有代码文件。您可能已经这样做了,但是一次干净完整的重建可能会有所帮助。@DavidYaw感谢您的建议——我一直在进行完整的重建,但没有成功。我想我在这里发现了一些东西……我也有同样的问题,但在我的例子中,对的引用也需要在托管文件中(除非我们更改API)。有没有其他方法可以解决这个问题?我唯一可以推荐的方法是尝试通过使用动态链接库以某种方式拆分托管/非托管代码?这碰巧对我有用,但我不确定它概括得有多好……我已经这样做了(但这仍然是一个很好的提示)。正如您所看到的,我错误地将托管库链接到了不需要的非托管库,不必要地导致了LNK2022。这也是由包含的
    #定义
    之间的差异造成的,比如
    WINVER
    \u WIN32\u WINNT
    @JohnGrabanski删除了死链接。。。有点晚了。就我而言,我刚刚将.vcxproj升级到VS2015,之前我在VS2013中构建了它。Clean->Rebuild修复了它。这个解决方案解决了我遇到的类似问题,即重复类型中的字段声明不一致