16

作業中のプロジェクトで、新しいリンカーエラーが発生しました。

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).

Windows7でVisualStudio2010を使用しています。

このプロジェクトはコンパイルに使用されました。これは、一部のアンマネージコードのC ++ / CLI DLLラッパーであるため、共通言語ランタイムサポートが含まれています。変更されたのは、リンクした外部静的ライブラリが「更新」されたことです。リンク先のプロジェクトをコンパイルしようとすると、このエラーが発生します。

この問題に対するMicrosoftの「ヘルプ」は、「オブジェクトファイルに対してildasm –tokensを実行して、error_messageにリストされているトークンを持つタイプを見つけ、違いを探す」ことです。次に、このページを確認したところ、この/tokensオプションは.exeファイルと.dllファイルにのみ有効であることがわかりました...しかし、これはリンカーエラーであるため、.dllファイルはまだ作成されていません。

のようなものを実行しようとしましildasm -tokens AssemblyInfo.objたが、発生する唯一のことは、この非常に役立つエラーメッセージでウィンドウが開くことです。

マイクロソフトに感謝します

マイクロソフトに感謝します!

この問題のトラブルシューティングを続行する方法がよくわかりません。リリースビルドは正しく機能します-混乱しているのはデバッグだけです。std::stringミックスのどこかで、タイプが異なるサイズか何かだと思います...

何か案は?

4

3 に答える 3

17

了解しました。解決しました。実際に大きな助けとなった別のSOの質問がありました。問題についてもう少し詳しく説明したこの記事にリンクすることになりました。基本的に、標準ライブラリ文字列がマネージコードとアンマネージコードの両方でコンパイルされるという問題があります。解決策は、CLRを必要とするファイルでのみCLRを有効にすることでした。詳細には、これが私がしたことです:

  1. プロジェクト全体/clrに適用されていたスイッチを削除しました
  2. .cpp実際にCLRを必要とする2つのファイルを選択し、で手動で選択/clrしましC/C++ -> General -> Common Language RunTime Supportた。
  3. Program Database /Ziプロジェクト全体をからに切り替えましたProgram Database for Edit and Continue /ZI。サポートがインクリメンタルリンクを無効にしているように見えたので、これは警告を取り除き/clrました。そして、私のネイティブコードは、編集と続行を使用しようとしていたため、警告をスローしていました。
  4. 次に、いくつかの警告が表示されました。これは、有効なファイルExtensionAttributeに次のスイッチを追加することで修正しました。/clr/clr:nostdlib /AI"%ProgramFiles%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0"
  5. /clrデバッグビルドでは、有効なファイルで一連のデバッグオプションを無効にする必要がありました。具体的には、の下で、、、にC/C++ -> Code Generation設定Enable Minimal Rebuildします。これにより、一連の警告も削除されました。No (/RM-)Basic Runtime ChecksDefault
  6. デバッグビルドとリリースビルドで、有効なファイルをオンに設定Enable C++ Exceptionsします。Noclr

お役に立てれば!

于 2012-08-16T16:05:44.417 に答える
2

VisualStudioが壊れた状態だったようです。そのエラーが発生したのは私だけでした。変化はありませんでした。サイドでプロジェクトを再チェックして修正しました。多分それは私のユーザーファイルの問題でした。

于 2014-12-09T14:53:26.933 に答える
2

私の修正は、構成プロパティ-> C / C++->コード生成->構造体メンバーの配置->16バイト(/ Zp16)を設定することでした。

于 2015-11-30T22:13:06.220 に答える