LNK2022和LNK2034链接器错误与CRT版本10.0

C J*_*son 6 windows winapi stl linker-errors visual-studio-2010

很抱歉打扰这个问题的人,但我已经研究了几个小时了,还没有决议:

我正在将一个相当庞大的应用程序移植到Visual Studio 2010中的10.0 CRT(编译器).该应用程序是使用/ clr管理的C++/CLI.大多数代码都是本机代码(95%),其中包含一些托管部分.

所以我的工作是将.vcxproj中的开关定位到较新的10.0 CRT(即编译器).我们以前使用的是v90,或者使用VS 2008 SP1附带的VC编译器.

好的,这么重大变化?实际上看起来像一堆.我修复了一些处理集合的迭代器问题,这一切都非常简单.

但这些链接器错误正在扼杀我.任何帮助,将不胜感激:

1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (80131195) : Custom attributes are not consistent: (0x0c0001c0).
1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2022: metadata operation failed (80131195) : Custom attributes are not consistent: (0x0c0001c5).
...

1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2034: metadata inconsistent with COFF symbol table: symbol '??0?$allocator@D@std@@$$FQAE@ABV01@@Z' (06000141) has inconsistent metadata with (0A000F75) in identity.obj
1>MSVCMRTD.lib(locale0_implib.obj) : error LNK2034: metadata inconsistent with COFF symbol table: symbol '??0?$allocator@D@std@@$$FQAE@ABV01@@Z' (06000141) has inconsistent metadata with (0A000F76) in ICustAttribCollapseManagerImp.obj
... (repeated hundreds of times)
Run Code Online (Sandbox Code Playgroud)

我继续前进,未修饰符号:

??0?$allocator@D@std@@$$FQAE@ABV01@@Z
Run Code Online (Sandbox Code Playgroud)

得到了:

public: __thiscall std::allocator<char>::allocator<char>(class std::allocator<char> const &)
Run Code Online (Sandbox Code Playgroud)

所以,据我所知,msvcmrtd.lib文件以一种方式编译了这个std :: allocator,而我的项目设置中的其他内容(#pragma managed ??)是以另一种不同的方式编译的.但如果是这样,我该寻找什么?多年来,使用旧的编译器编译好了.

注意:我们目前是3.5 .NET框架(不确定是否有帮助......我对此表示怀疑)

谢谢

Han*_*ant 3

这是一个很难诊断的问题,链接器错误很糟糕并且记录很少。Microsoft 的 STL 维护者 Stephan Lavavej 在页面底部的这个线程中发布了一篇关于此问题的帖子。我不得不说,除了尝试在项目设置中禁用迭代器调试(预处理器定义中的_HAS_ITERATOR_DEBUGGING = 0)之外,我在其中没有看到太多建议。

您确实需要考虑代码审查。看起来您确实正在将 STL 代码编译为托管代码。这通常是有效的(减去链接器的麻烦),但这确实是错误的做法。将 STL 集合类留给您的本机代码,在托管代码中使用 BCL 集合类(List<> 等)。

  • 解决:通过仅在需要它的(~12)个文件上设置 /clr 开关,并为整个项目关闭 /clr。 (3认同)