2

私は知っています:これはすでに対処されていますが、これについてできる限り読んだ後でも、なぜ修正できなかったのか、を修正する必要があるのか​​さえわかりませんでした.

thisによると、プロジェクトで 2 つの異なる標準ランタイム ライブラリを同時にコンパイルに使用すると、問題が発生することがわかります。これらの中で最も一般的なのは、libcmt.libmsvcrt.libであり、それらに相当するデバッグ用のものもあります。

どうやら、私のプロジェクトはこれらの両方を使用しているため、次の警告が一緒に表示されます。

1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>glew32s.lib(glew.obj) : warning LNK4099: PDB 'vc100.pdb' was not found with 'glew32s.lib(glew.obj)' or at 'C:\Programming\VS\Play_VS\Debug\vc100.pdb'; linking object as if no debug info

ご覧のとおり、これには glew を使用しています。コードはエラーなしでコンパイルされますが、使用している外部ライブラリがGLEW/GLFW/GLU/GLMだけであるという事実から、現在のビルドに構成上の問題があるのではないかと考えています。MFC や ATL、その他の Visual C++ ライブラリは、ネイティブの STL 実装以外には使用していません。

最初に、プロジェクトのプロパティを からMulti-Threaded [Debug] DLLに設定してみましMulti-Threaded [Debug]たが、次の出力が生成されて事態が悪化しているようです。

1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: _free already defined in LIBCMTD.lib(dbgfree.obj)
1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: _malloc already defined in LIBCMTD.lib(dbgmalloc.obj)
1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: _fprintf already defined in LIBCMTD.lib(fprintf.obj)
1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: ___iob_func already defined in LIBCMTD.lib(_file.obj)
1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: _strchr already defined in LIBCMTD.lib(strchr.obj)
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) already defined in LIBCMTD.lib(typinfo.obj)
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) already defined in LIBCMTD.lib(typinfo.obj)
1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>C:\Programming\VS\Play_VS\Debug\Play_VS.exe : fatal error LNK1169: one or more multiply defined symbols found

同様に、デバッグ ビルドとリリース ビルドの両方のコンパイル フラグを調べると/MT、どちらのコマンド生成入力にも (libcmt.lib) が存在しないことがわかります。私の知る限り、Windows でネイティブ C++ アプリケーションを作成するほとんどの人は/MDmsvcrt.lib.

デバッグ ビルド入力

/GS /analyze- /W3 /Zc:wchar_t /ZI /Gm /Od /Fd"Debug\vc110.pdb" /fp:precise /D "GLEW_STATIC" /D "_CRT_SECURE_NO_WARNINGS" /D "_MBCS" /errorReport:prompt /WX- /Zc:forScope /RTC1 /GR /Gd /Oy- /MDd /Fa"Debug\" /EHsc /nologo /Fo"Debug\" /Fp"Debug\Play_VS.pch" 

リリース ビルド入力

/GS /GL /analyze- /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /Fd"Release\vc110.pdb" /fp:precise /D "_CRT_SECURE_NO_WARNINGS" /D "_MBCS" /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /Oi /MD /Fa"Release\" /EHsc /nologo /Fo"Release\" /Fp"Release\Play_VS.pch" 

どうすればこれを修正できますか? 助けてくれてありがとう。

4

1 に答える 1

1

/MD (CRT の DLL バージョンを使用) でコンパイルされたコードと、/MT (静的 CRT ライブラリを使用) でコンパイルされたコードを混在させています。すべてのソース コード ファイルを同じ設定でコンパイルする必要があります。/MD を使用して事前にコンパイルされたライブラリを使用する場合は、ほとんどの場合正しい設定であるため、独自のコードもこの設定でコンパイルする必要があります。

プロジェクト + プロパティ、C/C++、コード生成、ランタイム ライブラリ。

これらのライブラリはおそらく以前のバージョンの CRT でコンパイルされていることに注意してください。msvcr100.dll はまったく新しいものです。問題が発生するかどうかわからない場合は、リンカーがマニフェストを生成しないようにする必要がある場合があります。また、msvcr100.dll など、必要な DLL をターゲット マシンに展開する必要があります。

同じ問題があります: error LNK2005: xxx already defined in MSVCRT.lib(MSVCR100.dll) C:\something\LIBCMT.lib(setlocal.obj)

于 2014-03-13T15:44:34.043 に答える