4

Visual C ++プロジェクト(MFCを使用)をMicrosoft Visual Studio 2012でコンパイルしようとすると、次のエラーが返されます。

error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj)   
error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj) 
error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) already defined in LIBCMTD.lib(delete2.obj)
error LNK1169: one or more multiply defined symbols found

そこで、少しグーグルで検索して、次のページを見つけました。http://support.microsoft.com/?scid=kb%3Ben-us % 3B148652&x=13&y=8 ソリューション1を試しましたが、[ライブラリを無視する]ボックスが存在しません。オブジェクト/ライブラリモジュールボックスも同様です。ライブラリを無視する場合、特定のライブラリを無視することがわかりましたが、手順5をスキップすると、17xxエラーしか発生しませんでした。

何度もグーグルで検索しましたが、常に同じページに戻ってきました。VisualStudio 2012でこの問題を修正するにはどうすればよいですか?

4

5 に答える 5

2

この問題の原因として最も可能性が高いのは、プロジェクトのさまざまな部分にリンクされたさまざまなバージョンのCランタイム(マルチスレッドまたはシングルスレッド、デバッグまたは非デバッグ)があることです。おそらく、メインの実行可能ファイルには1つのランタイムがリンクされていますが、別のランタイムで構築されたライブラリにリンクしています。明示的にリンクしている各ライブラリを順番にチェックして、奇妙なライブラリを見つけます。

于 2012-10-16T12:50:54.663 に答える
2

問題を修正しました。インクルードの順序に問題があることがわかりました。ただし、すべてのファイルにafx.hインクルード(プロパティ-> c / c ++ / Advanced / forceインクルードファイル)を強制すると、問題が修正されました。

于 2012-10-30T14:49:20.970 に答える
2

また、LTGC(リンク時コード生成)を使用していoperator newて、CRTに存在するシンボルまたはその他のシンボルのカスタム実装を追加した場合は、完全な再構築を行う必要があります。その後、インクリメンタルリンカーは省略します。 「弱い参照」。これはVS2015でも当てはまります。

于 2016-03-29T11:13:51.953 に答える
1

わかりました。.cファイル(コンパイルユニット)をMFCプロジェクトと組み合わせながら、この問題に対処しました。.cファイルの名前(コンパイル単位)は、リンク先のライブラリにあったものと同じです。ファイルの名前を変更すると、リンカーの混乱がなくなりました。

上記の他の解決策を試しましたが、どれも機能しませんでした。

于 2016-03-04T01:04:20.227 に答える
0

Visual Studio 2008または2010でこの問題が発生しましたか?

Visual Studio 2012でも同様の失敗が見られます。以前のバージョンのツールチェーンで正常にリンクされていたコードが、の複数のインスタンスを提供するようになりerror LNK2005: "void * __cdecl operator new(unsigned __int64,void *)" (??2@YAPEAX_KPEAX@Z) already definedました。あなたとは異なり、私たちはMFCを使用していません。

もちろん、これは問題の解決策ではありませんが、Microsoftのコンパイラまたはリンカ開発のリグレッションバグを示している可能性があります。同じコードがVS2010で正常に機能することを確認できれば、それは私の診断を確認する傾向があります。

(これを確認するには、ソリューション内のすべてのプロジェクトに対して、[プロジェクトのプロパティ]>[構成のプロパティ]>[一般]>[プラットフォームツールセット]を「v110」から「v100」に設定し、すべてを再構築します。同じマシンにVS2010がインストールされていると仮定すると、次のことができます。これはすべてVS2012を離れることなく。)

追加するために編集:このエラーは、バグ#768788としてMicrosoftに報告されています。

于 2012-10-26T03:30:39.360 に答える