このリンカーエラーが発生します。
mfcs80.lib(dllmodul.obj):エラーLNK2005:_DllMain @ 12はMSVCRT.lib(dllmain.obj)ですでに定義されています
このバグを取り除く正しい方法を教えてください。このバグについてマイクロソフトサポートサイトで解決策を読みましたが、あまり役に立ちませんでした。
PlatformSDKでVS2005を使用しています
このリンカーエラーが発生します。
mfcs80.lib(dllmodul.obj):エラーLNK2005:_DllMain @ 12はMSVCRT.lib(dllmain.obj)ですでに定義されています
このバグを取り除く正しい方法を教えてください。このバグについてマイクロソフトサポートサイトで解決策を読みましたが、あまり役に立ちませんでした。
PlatformSDKでVS2005を使用しています
同じエラーメッセージが表示されましたが、ここでの回答はどれも解決しませんでした。したがって、MFC を使用する DLL プロジェクトを作成するときにその問題が発生した場合は、次の行を入力することで解決できます。
extern "C" { int _afxForceUSRDLL; }
DllMain
が定義されている cpp ファイルに追加します。次に、DllMain
dllmain.obj からの実装ではなく、独自の実装が使用されます。
MFC ライブラリを使用しようとすると、直接的または間接的に afx.h をインクルードし、MFC(afx.h) はリンカーに __afxForceUSRDLL のシンボルを見つけて、__afxForceUSRDLL を含むオブジェクトをプログラムに入れるように指示します。 __afxForceUSRDLL が dllmodule.cpp で定義されているため、dllmodule.obj をプログラムに挿入します。
それが一般的なシナリオです。mfc dll プロジェクトで独自の DllMain を使用したい場合、リンカは 2 つの DllMain があり、1 つはコードにあり、もう 1 つは Dllmodule.obj にあると不平を言います。
したがって、リンカーに __afxForceUSRDLL の dllmain.obj を追加するように指示する必要があります。したがって、独自の DllMain が定義されている独自の cpp ファイルで __afxForceUSRDLL を定義する必要があります。そうすれば、リンカは mfc の dllmodule.obj を無視し、1 つの DllMain のみを参照し、文句を言うことはありません。
リンカのエラーをよく読んで知識を適用すれば、自分でそこにたどり着けるかもしれません:
リンカーは、多数のコンパイル済みオブジェクトとライブラリをリンクして、バイナリを取得します。
各オブジェクト/ライブラリの説明
2 つのオブジェクトが同じシンボルを定義すると、まさにこのリンカー エラーが発生します。あなたの場合、 mfcs80.lib と MSVCRT.lib の両方が _DllMain@12 シンボルを定義しています。
エラーを取り除く:
独自の DllMain を定義している場合は、プロジェクト設定で、[構成プロパティ/全般] の [MFC の使用] を [標準の Windows ライブラリを使用] に設定する必要があります。
変更後は、クリーン リビルドを行う必要があります。
私のプロジェクトでは、プロジェクト設定に追加の依存関係として mfcs80.lib と msvcrt.lib を追加することで、この問題を解決できました。「追加の依存関係」は、Linker -> Input の下にあります。
デバッグ構成では、それぞれ mfcs80d.lib と msvcrtd.lib である必要があります。
ちなみに、私はVisual Studio 2010で作業しているので、私の場合、MFC libはmfc100.libと呼ばれています。
なぜこれが機能したのかわかりません。「MFC の使用」を「共有 dll で MFC を使用する」に設定しているため、これらの lib ファイルを追加の依存関係として追加する必要はありません。これらのライブラリを追加の依存関係として指定することで、異なる順序でリンクされていると思います。
この解決策は、マイクロソフトのサイトhttp://support.microsoft.com/kb/148652で提案されているものとほぼ同じですが、[特定の既定のライブラリを無視する] ボックスに何も入力する必要はありませんでした。
ATL プロジェクトでこのエラーが発生しているすべての人 (主に MFC サポートを追加しようとしている場合) のために、何日もフラストレーションを感じた後に見つけた解決策を次に示します。
まず第一に、このリンクは他のすべてのリンクよりも役に立ちました。それは私を正しい方向に向けました。この問題は、何らかの理由で「生成されたファイル」(タイプ GUID と同様にプロキシおよびスタブ コードを含む) が削除され、プロジェクトに再度追加された場合に発生します。これにより、Visual Studio はそれらを間違った順序で追加します!
Yc/Yu
通常、最初に「ATL には C++ コンパイルが必要です」というエラーが表示されますが、そのファイルの (プリコンパイル済みヘッダー) 設定を確認することで、これを修正できた可能性があります。
次にすべきことは、プロジェクトをアンロードして編集することです。ビルドを定義し、注文を含むアイテム グループを検索します (ClCompile
およびClInclude
)。順序と設定を確認してください。
コンパイルは次の順序で表示されます。
dllmain.cpp
(にCompileAsManaged
設定しfalse
てPrecompiledHeader
空のままにします)。MyLib.cpp
、含むDllCanUnloadNow
など)MyLib_i.c
; と同じ設定dllmain.cpp
)stdafx.cpp
( にPrecompiledHeader
設定Create
)xdlldata.c
( と同じ設定dllmain.cpp
)インクルードは次のように並べる必要があります。
dllmain.h
MyLib_i.h
Resource.h
stdafx.h
targetver.h
xdlldata.h
ビルド順序を修正するとプロジェクトが修正され、新しいクリーン ビルドを作成できました。
私の場合、プリプロセッサ ディレクティブに問題がありました。_USRDLL
定義されるべきではないときに、何らかの理由で定義されました。
これを確認するには、メニューに移動し、を Project 選択 Project Properties してから、スニペット Configuration Properties -->を選択します Preprocessor 。
プリプロセッサ ディレクティブはそこにあります。
各 .cpp ファイルの先頭に「Stdafx.h」が含まれていることを確認してください。まったく同じエラーが発生し、このヘッダーがまったく含まれていない単一の .cpp ファイルがありました。#include を追加すると問題が解決しました。
私は非常によく似た問題を抱えています。[mfcs110d.lib(dllmodul.obj) : エラー LNK2005: _DllMain@12 は既に MSVCRTD.lib(dllmain.obj) で定義されています] および解決策は、追加の依存関係に mfcs110d.lib を追加することでした
を含める直前#undef
、またはさらに良いことに、プロジェクト構成を編集してマクロを削除します。_USRDLL
afx.h
これは、MFC 拡張 DLL の通常の構成です。 MFC DLLのビルド設定
私は個人的にこのエラーをこの方法で取り除きました: でプロジェクトを右クリックし、ポップアップ メニューからSolution Explorer
選択し、タブをクリックして に追加しました。Visual Studio 2005 を使用している場合は、「71」などではなく「80」にする必要があります。Properties
Linker
mfcs71ud.lib
Additional Dependencies
これが役に立ちました: http://support.microsoft.com/kb/148652
基本的にリンカの順序が間違っていました。CRT ライブラリは MFC ライブラリの前にリンクされていました。結局のところ、MFC ライブラリを最初にリンクする必要があり、次に CRT ライブラリをリンクすることができました。
ユッコマイクロソフト!!
問題を修正するには、 のフィールドでmfc80ud.lib
andを宣言します。mfcs80ud.lib
Additional Dependancies
Project Properties -> Linker Tab -> Input of Visual Studio