Visual C++ で CRT ライブラリおよび MFC ライブラリのリンク順序が正しくないときに LNK2005 エラーが発生する

文書翻訳 文書翻訳
文書番号: 148652 - 対象製品
すべて展開する | すべて折りたたむ

目次

現象

C ランタイム (CRT) ライブラリと Microsoft Foundation Class (MFC) ライブラリのリンク順序が正しくないと、次のいずれかの LNK2005 エラーが発生する場合があります。
nafxcwd.lib(afxmem.obj) :error LNK2005:
"void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) は既に
LIBCMTD.lib(new.obj) で定義されています
nafxcwd.lib(afxmem.obj) :error LNK2005:
"void __cdecl operator delete(void *)" (??3@YAXPAX@Z) は既に
LIBCMTD.lib(dbgnew.obj) で定義されています
nafxcwd.lib(afxmem.obj) :error LNK2005:
"void * __cdecl operator new(unsigned int,int,char const *,int)"
(??2@YAPAXIHPBDH@Z) は既に LIBCMTD.lib(dbgnew.obj) で定義されています
mfcs40d.lib(dllmodul.obj):error LNK2005:_DllMain@12 は既に
MSVCRTD.LIB (dllmain.obj) で定義されています
mfcs42d.lib(dllmodul.obj):error LNK2005:_DllMain@12 は既に
msvcrtd.lib(dllmain.obj) で定義されています

原因

CRT ライブラリでは、newdelete、および DllMain の各関数で弱い外部リンケージを使用します。MFC ライブラリにも newdelete、および DllMain の各関数が含まれています。これらの関数では、MFC ライブラリを CRT ライブラリより先にリンクする必要があります。

解決方法

この問題を解決するには、次の 2 つの方法があります。最初の解決方法では、ライブラリが正しい順序でリンクされるようにリンカーを設定します。2 番目の解決方法では、問題の原因になっているモジュールを見つけて修正します。

: 次の手順は Visual C++ 6.0 に基づいています。

解決方法 1: ライブラリが正しい順序でリンクされるようにリンカーを設定する

  1. [プロジェクト] メニューの [設定] をクリックします。
  2. [プロジェクトの設定] ダイアログ ボックスの [設定の対象] ボックスで、リンク エラーが発生しているプロジェクト構成をクリックします。
  3. [リンク] タブで、[カテゴリ] ボックスの一覧の [インプット] をクリックします。
  4. [無視するライブラリ] ボックスに、ライブラリ名 (Nafxcwd.lib;Libcmtd.lib など) を挿入します。

    : リンカーのコマンド ラインで /NOD:<library name> と指定するのに相当します。
  5. [オブジェクト/ライブラリ モジュール] ボックスにライブラリ名を挿入します。行の先頭に正しい順序で 2 つのライブラリが並ぶようにする必要があります (Nafxcwd.lib Libcmtd.lib など)。
このオプションを Visual C++ .NET で設定するには、オンライン ヘルプのトピック「Visual C++ プロジェクトのプロパティの設定」を参照してください。

解決方法 2: 問題のモジュールを見つけて修正する

現在のライブラリのリンク順序を表示するには、以下の手順を実行します。
  1. [プロジェクト] メニューの [設定] をクリックします。
  2. [プロジェクトの設定] ダイアログ ボックスの [設定の対象] ボックスで、リンク エラーが発生しているプロジェクト構成をクリックします。
  3. [リンク] タブの [プロジェクト オプション] ボックスに「/verbose:lib」と入力します。
  4. プロジェクトをリビルドします。リンク処理時にライブラリの一覧がアウトプット ウィンドウに表示されます。

状況

この動作は仕様です。

詳細

MFC ライブラリを使用する場合は、必ず CRT ライブラリの前にリンクする必要があります。これを行うには、プロジェクト内のすべてのファイルの先頭に、Msdev\Mfc\Include\Afx.h を直接的 (#include <Afx.h>) または間接的 (#include <Stdafx.h>) にインクルードします。インクルード ファイル Afx.h は、#pragma comment (lib,"<ライブラリ名>") ディレクティブを使用して、強制的にライブラリの順序が正しくなるようにします。

ソース ファイルの拡張子が .c の場合、またはファイルの拡張子が .cpp で MFC を使用していない場合は、小さなヘッダー ファイル (Forcelib.h) を作成してモジュールの先頭にインクルードします。この新しいヘッダーにより、ライブラリの検索順序が正しくなります。

Visual C++ にこのヘッダー ファイルは含まれていません。このファイルを作成するには、以下の手順を実行します。
  1. Msdev\Mfc\Include\Afx.h を開きます。
  2. #ifndef _AFX_NOFORCE_LIBS と #endif //!_AFX_NOFORCE_LIBS との間の行を選択します。
  3. 選択範囲をクリップボードにコピーします。
  4. 新しいテキスト ファイルを作成します。
  5. この新しいファイルにクリップボードの内容を貼り付けます。
  6. Msdev\Mfc\Include\Forcelib.h としてファイルを保存します。

Visual C++ .NET での問題の再現手順

  1. Microsoft Visual Studio .NET を起動します。
  2. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
  3. [プロジェクトの種類] ボックスの一覧の [Visual C++ プロジェクト] をクリックし、[テンプレート] ボックスの一覧の [MFC アプリケーション] をクリックします。
  4. [プロジェクト名] ボックスに「Q148652」と入力します。
  5. [場所] ボックスに「C:\Test」と入力して [OK] をクリックします。
  6. [MFC アプリケーション ウィザード] ダイアログ ボックスで、[アプリケーションの種類] をクリックします。
  7. [アプリケーションの種類] の [ダイアログ ベース] をクリックし、[MFC の使用法] の [スタティック ライブラリで MFC を使用] をクリックします。
  8. [完了] をクリックします。
  9. ソリューション エクスプローラーで、[ソース ファイル] の下にある 3 つの .cpp ファイルすべてを選択します。
  10. 選択したファイルを右クリックし、[削除] をクリックします。
  11. [ソース ファイル] を右クリックし、[追加] をポイントして、[新しい項目の追加] をクリックします。
  12. [テンプレート] の [C++ ファイル] をクリックします。[名前] ボックスに「Aa」と入力します。[開く] をクリックします。
  13. 次のコードを Aa.cpp ファイルに貼り付けます。
    int test(){new int; return 1;}
  14. [ソース ファイル] を右クリックし、[追加] をポイントして、[既存項目の追加] をクリックします。
  15. 次の各ファイルを選択します。
    • Q148652.cpp
    • Q148652Dlg.cpp
    • stdafx.cpp
  16. [開く] をクリックします。
  17. 手順 15. で選択したファイルが [ソース ファイル] の下に表示されます。
  18. [ソース ファイル] の下にある 4 つの .cpp ファイルすべてを選択します。
  19. 選択した 4 つの .cpp ファイルを右クリックし、[プロパティ] をクリックします。
  20. [構成プロパティ] を展開し、[C/C++] を展開します。
  21. [プリコンパイル済みヘッダー] をクリックします。
  22. "プリコンパイル済みヘッダーの作成/使用" プロパティを [プリコンパイル済みヘッダーを使用しない] に設定します。[OK] をクリックします。
  23. [ビルド] メニューの [ソリューションのリビルド] をクリックします。

プロパティ

文書番号: 148652 - 最終更新日: 2010年3月26日 - リビジョン: 7.1
この資料は以下の製品について記述したものです。
  • Microsoft Visual C++ 2008 Express Edition
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 4.1 Subscription
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
キーワード:?
kbsweptvs2008 kbtshoot kbarttypeinf kberrmsg kbprb KB148652
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com