1

昨日、2005年からVisualStudio2008にアップグレードしました。さて、私はいくつかの新しいクラス(特にCFrameWndEx)を利用しようとしていますが、エラーが発生します。CFrameWndEx子クラスを宣言してから、afxcmdiframewndex.hをstdafx.hに追加すると、エラーが1つだけ発生します。一見無害なものです。「COleDropTarget基本クラスが未定義です」というエラーが表示されます。OK、簡単な修正、afxole.hをインクルードに追加すれば、すべてうまくいくでしょう。しかし、私がした後、それはすべての地獄が解き放たれるときです。リンクするまで、出力のすべてが良好です。

1>LIBCMT.lib(sprintf.obj) : error LNK2005: _sprintf already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(invarg.obj) : error LNK2005: __invoke_watson already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(tidtable.obj) : error LNK2005: __encode_pointer already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(tidtable.obj) : error LNK2005: __decode_pointer already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(setlocal.obj) : error LNK2005: __configthreadlocale already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __amsg_exit already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __initterm_e already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(crt0dat.obj) : error LNK2005: _exit already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __exit already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __cexit already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(mlock.obj) : error LNK2005: __unlock already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(mlock.obj) : error LNK2005: __lock already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(winxfltr.obj) : error LNK2005: __XcptFilter already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(strftime.obj) : error LNK2005: _strftime already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_a already defined in msvcrtd.lib(cinitexe.obj)
1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_z already defined in msvcrtd.lib(cinitexe.obj)
1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_a already defined in msvcrtd.lib(cinitexe.obj)
1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_z already defined in msvcrtd.lib(cinitexe.obj)
1>LIBCMT.lib(hooks.obj) : error LNK2005: "void __cdecl terminate(void)" (?terminate@@YAXXZ) already defined in msvcrtd.lib(MSVCR90D.dll)
1>LIBCMT.lib(errmode.obj) : error LNK2005: ___set_app_type already defined in msvcrtd.lib(MSVCR90D.dll)
1>msvcrtd.lib(MSVCR90D.dll) : error LNK2005: __setmbcp already defined in LIBCMT.lib(mbctype.obj)
1>LINK : warning LNK4098: defaultlib 'msvcrtd.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library

また、/ NODEFAULTLIBを使用してmsvcrtd.libとLIBCMTを削除すると、さらに多くの問題が発生します。これを修正する1つの方法は、msvcrtd.libおよびLIBCMTと競合するライブラリを見つけることだと思いますが、これを行うにはどうすればよいですか?

誰かが以前にこの問題を見たことがありますか?Microsoftコードとの競合のようですが、私のコードである可能性があります。どんな助けでも大歓迎です。

前もって感謝します。

4

1 に答える 1

0

あなたの問題は、msvcrtd.lib が LIBCMT.lib と競合していることです。両方を使用するべきではありません。msvcrtd.lib ライブラリは、マルチスレッド ダイナミック リンク デバッグ ランタイム (/MDd) 用にコンパイルするときに使用され、LIBCMT は、マルチスレッド スタティック リンク 非デバッグ ランタイム (/MT) 用にコンパイルするときに使用されます。背景については、こちらを参照してください。

スイッチが指定されていない場合、LIBCMT がデフォルトで使用されます。

「構成プロパティ」を確認する価値があるかもしれません | C/C++ | "コード生成" | 「ランタイム ライブラリ」の設定で、リリース ビルドの場合は /MD、デバッグ ビルドの場合は /MDd に設定されていることを確認します。個々のファイルの設定が異なる可能性があるため、プロジェクトとプロジェクト内のすべての cpp ファイルの設定を確認する必要があります。

正直なところ、スイッチの設定が間違っていた場合、afxole.h をインクルードする前に問題が発生すると予想していました。問題は、スイッチの設定が間違っているだけではなく、より微妙な場合があります。

更新: /ML スイッチへの参照を取り出しました。これは、Visual Studio 2005 ではなく Visual Studio 2003 でした。

更新:これについてもう少し考えてください。追加afxframewndex.hした場合は、明示的に含める必要はありませafxole.hん。含まれているはずです。

/showIncludesをオンにしてプログラムをコンパイルすると、出力ウィンドウに次のように表示されます...

1>Note: including file:  c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\atlmfc\include\afxframewndex.h
[snipped all the includes due to afxframeimpl.h and afxcontrolbarutil.h]
1>Note: including file:   c:\program files (x86)\microsoft visual studio 9.0\vc\atlmfc\include\afxpopupmenu.h
1>Note: including file:    c:\program files (x86)\microsoft visual studio 9.0\vc\atlmfc\include\afxpopupmenubar.h
1>Note: including file:     c:\program files (x86)\microsoft visual studio 9.0\vc\atlmfc\include\afxtoolbar.h
1>Note: including file:      c:\program files (x86)\microsoft visual studio 9.0\vc\atlmfc\include\afxtoolbardroptarget.h
1>Note: including file:       c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\atlmfc\include\afxole.h

afxole.h の明示的な #include を取り除き、afxframewndex.h が含まれているにもかかわらず COleDropTarget 基本クラスが定義されていない理由を理解する必要があります。

于 2011-07-28T20:26:16.843 に答える