STD :: COUTを備えたMSVC 2010リンカーエラー2005
-
08-10-2019 - |
質問
私はこの問題を抱えている人々の他の例を見つけましたが、彼らの解決策に運がありませんでした。ブーストスレッドとバインドを使用する静的ライブラリでSTD :: Coutを使用しようとしています。私が使用しないとき std::cout
メインプログラムと一緒に正常にリンクしますが、ライブラリをコンパイルしたときに問題はありませんが、静的ライブラリを使用するメインプログラムをコンパイルしてリンクすると、次のようなものがたくさんあります。
2>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_z already defined in MSVCRTD.lib(cinitexe.obj) 2>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_a already defined in MSVCRTD.lib(cinitexe.obj) 2>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_z already defined in MSVCRTD.lib(cinitexe.obj) 2>LIBCMT.lib(mlock.obj) : error LNK2005: __unlock already defined in MSVCRTD.lib(MSVCR100D.dll) 2>LIBCMT.lib(mlock.obj) : error LNK2005: __lock already defined in MSVCRTD.lib(MSVCR100D.dll) 2>LIBCMT.lib(winxfltr.obj) : error LNK2005: __XcptFilter already defined in MSVCRTD.lib(MSVCR100D.dll) 2>LIBCMT.lib(crt0.obj) : error LNK2005: _mainCRTStartup already defined in MSVCRTD.lib(crtexe.obj)
等...
リンカー設定に行って、エラー出力にリストされている競合するライブラリを使用するのを止めようとしましたが、正しく理解できません。 1つのライブラリの使用を停止するように言うと、問題が解決するかもしれませんが、いくつかの欠落している外部記号を与えてください。これを修正するためにできることの手がかりはありますか? 「log」などと呼ばれる別のクラスを作成し、メイン.exeからアクセスするだけです(文字列ライブラリを使用して、再び問題を引き起こす可能性がありますが、まだ試していません)。助けてくれてありがとう。
解決
チェック - >プロジェクト+プロパティ、c/c ++、コード生成、ランタイムライブラリを試してみてください。 .libとメインプロジェクトは、ここで同じ設定を使用する必要があります。
他のヒント
プロジェクト、プロパティ、C/C ++、コード生成、ランタイムライブラリ設定を右クリックします。それがあなたの問題の原因です。設定 /mtおよび /mdがあります。この設定に矛盾する値を持つコードをリンクしているため、すべてが同じものでコンパイルされる必要があります。
ブーストが1つになる可能性があります。リンカーの追加依存関係の設定を確認してください。 IIRC、.libsにはMTまたはMDの名前があります。
LNK2005は、2つのコンパイルオブジェクトに同じ記号が含まれている場合に発生します。それらをリンクしようとすると、リンカーはすべての複製があるという事実をどうするかを知らないため、エラーが発生します。
具体的には、静的lib /多分ブーストがコンパイルされている可能性があるように聞こえます /MT
MSVCランタイムを静的にリンクします。デフォルトのオプションでコードをコンパイルしようとしているようです(/MD
, 、への動的なリンク MSVCR100.DLL
, MSVCP100.DLL
).
見る http://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx
Static Libraryが動的ライブラリにリンクされていることを確認するか、静的にリンクされたコードを試してみることができます。
それを追加する必要があります D
最後に、デバッグを意味します。すなわち MSVCP100D.DLL
のデバッグバージョンです MSVCP100.DLL
.