このリンカーエラーが発生します。
mfcs80.lib(dllmodul.obj):エラーLNK2005:_DllMain @ 12はMSVCRT.lib(dllmain.obj)で既に定義されています
このバグを解消する正しい方法を教えてください。このバグについてマイクロソフトサポートサイトで解決策を読みましたが、あまり役に立ちませんでした。
VS 2005とPlatform SDKを使用しています
リンカエラーをよく読み、知識を適用すると、次のようになります。
リンカは、コンパイルされた多数のオブジェクトとライブラリをリンクして、バイナリを取得します。
各オブジェクト/ライブラリは、
2つのオブジェクトが同じシンボルを定義している場合、このリンカーエラーが発生します。あなたの場合、mfcs80.libとMSVCRT.libの両方が_DllMain @ 12シンボルを定義しています。
エラーを取り除く:
私は同じエラーメッセージを受け取りましたが、ここでの答えのどれも私のためにそれを解決しませんでした。したがって、MFCを使用するDLLプロジェクトを作成するときにその問題に遭遇した場合、次の行を入力することで解決できます。
extern "C" { int _afxForceUSRDLL; }
DllMain
が定義されているcppファイルに。次に、dllmain.objからの実装ではなく、独自のDllMain
実装が使用されます。
MFCライブラリを使用しようとすると、直接または間接的にafx.hが確実にインクルードされ、MFC(afx.h)はリンカーに__afxForceUSRDLLのシンボルを検索し、__ afxForceUSRDLLを含むそのオブジェクトをプログラムに配置するように指示します。 __afxForceUSRDLLはdllmodule.cppで定義されているため、dllmodule.objをプログラムに追加します。
それが一般的なシナリオです。 mfc dllプロジェクトで独自のDllMainを使用する場合、リンカーは、コードに1つ、Dllmodule.objに1つ、2つのDllMainがあると不平を言います。
したがって、リンカーに__afxForceUSRDLLのdllmain.objを追加するように指示する必要があります。したがって、独自のDllMainが定義されている独自のcppファイルで__afxForceUSRDLLを定義する必要があります。そうすると、リンカーはmfcのdllmodule.objを無視し、DllMainを1つだけ表示し、不平を言うことはありません。
独自のDllMainを定義している場合は、プロジェクト設定で、[構成プロパティ/全般]の[MFCの使用]を[標準のWindowsライブラリを使用]に設定する必要があります。
変更後は、クリーンな再構築を行う必要があります。
私のプロジェクトでは、プロジェクト設定に追加の依存関係としてmfcs80.libとmsvcrt.libを追加することで、この問題を解決できました。 「追加の依存関係」は、リンカー->入力の下にあります。
デバッグ構成では、それぞれmfcs80d.libおよびmsvcrtd.libでなければなりません。
ちなみに、私はVisual Studio 2010を使用しているので、私の場合、MFC libはmfc100.libと呼ばれています。
これがうまくいった理由はわかりません。私は既に「MFCの使用」を「共有DLLでMFCを使用する」に設定しているため、これらのlibファイルを追加の依存関係として追加する必要はありません。これらのライブラリを追加の依存関係として指定することにより、それらは異なる順序でリンクされると思います。
このソリューションは、Microsoftサイトで提案されているものとほぼ同じです: http://support.Microsoft.com/kb/148652 、ただし[特定のデフォルトライブラリを無視する]ボックスに何も入力する必要はありませんでした。
MSDNナレッジベースID Q148652。
http://support.Microsoft.com/kb/148652
原因:Visual C++はソースファイルをアルファベット順にコンパイルし、コンパイルしたオブジェクトファイルをアルファベット順にリンカーに渡します。リンカーがDLLDATAX.OBJを最初に処理する場合、ソースコードはDVCMainを参照します。DllMainはリンカーがMSVCRTD.LIB(dllmain.obj)からロードします。次に、リンカーは、#include "stdafx.h"を含むC++ファイルからコンパイルされたオブジェクトファイルを処理します。これは、リンカーがMFC42D.LIB(dllmodul.obj)からロードするシンボル__afxForceUSRDLLを参照します。このオブジェクトモジュールにはDllMainの実装も含まれているため、競合が発生します。
ATLプロジェクトでこのエラーが発生しているすべての人(主にMFCサポートを追加しようとしたとき)のために、私が苛立たしい日々の後に見つけた解決策を次に示します!
まず第一に、 このリンク は他のすべてのものより私に役立ちました。それは私を正しい方向に向けました。何らかの理由で「生成されたファイル」(タイプGUIDと同じようにプロキシとスタブコードを含む)が削除され、プロジェクトに再度追加された場合に、問題が発生します。これにより、Visual Studioは間違った順序でそれらを追加します!
通常、最初に「ATLにはC++コンパイルが必要です」というエラーが表示されますが、そのファイルのYc/Yu
(プリコンパイル済みヘッダー)設定を無効にすることでこれを修正した可能性があります。
次にすべきことは、プロジェクトをアンロードして編集することです。ビルドとインクルード順序(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
ビルド順序を修正するとプロジェクトが修正され、新しいクリーンビルドを作成できました。
非常に似た問題があります。 [mfcs110d.lib(dllmodul.obj):エラーLNK2005:_DllMain @ 12はMSVCRTD.lib(dllmain.obj)で既に定義されています]と解決策は追加の依存関係にmfcs110d.libを追加
私の場合、プリプロセッサディレクティブに問題がありました。何らかの理由で _USRDLL
が定義されるべきではありませんでした。
これを確認するには、メニューに移動します Project 、 選択する Project Properties 、次にスニペットを選択します Configuration Properties -> Preprocessor 。
プリプロセッサディレクティブはそこにあります。
私はこの方法で個人的にこのエラーを取り除きました:Solution Explorer
でプロジェクトを右クリックし、ポップアップメニューからProperties
を選択し、Linker
タブをクリックしてmfcs71ud.lib
をAdditional Dependencies
に追加しました。 Visual Studio 2005を使用している場合は、「71」ではなく「80」にする必要があります。
ただ#undef
_USRDLL
含める前にafx.h
またはそれ以上に、プロジェクト構成を編集してマクロを削除します。
これは、MFC拡張DLLの通常の構成です。 MFC DLLのビルド設定
各.cppファイルの先頭に「Stdafx.h」が含まれていることを確認してください。まったく同じエラーが発生し、このヘッダーがまったく含まれていない単一の.cppファイルがありました。 #includeを追加することで問題は解決しました。
ここでいくつかの答えを実行する共通のテーマがあります。
Avishek Bose:-
この問題を修正するには、[プロジェクトのプロパティ]-> [リンカータブ]-> [Visual Studioの入力]の[追加の依存関係]フィールドでmfc80ud.libおよびmfcs80ud.libを宣言します。
vmb100:-
私はVisual Studio 2010を使用しているため、MFC libはmfc100.libと呼ばれます。
joseAndresGomezTovar:-
非常に似た問題があります。 [mfcs110d.lib(dllmodul.obj):エラーLNK2005:_DllMain @ 12はMSVCRTD.lib(dllmain.obj)で既に定義されています]とソリューションはmfcs110d.libを追加の依存関係に追加しました
したがって、一般的なケースは、追加するライブラリの名前を最初に見つけることです...
そしてそれを追加する...
ここに解決策が見つかりました Visual Studio 2010ライブラリのリンク順
これは、リンカオプションの/ FORCE:MULTIPLEです。
[module(name = "mymodule")]を使用するには、ATLとMFCを混在させる必要がありました。 「__hook」キーワードを使用したMFCアプリケーションでの構築
この問題を解決するには、mfc80ud.lib
のmfcs80ud.lib
フィールドでAdditional Dependancies
とProject Properties -> Linker Tab -> Input of Visual Studio
を宣言してください。
私はこれを助けました: http://support.Microsoft.com/kb/148652
基本的に、リンカーの順序は正しくありませんでした。 CRTライブラリはMFCライブラリの前にリンクされていました。結局のところ、MFCライブラリは最初にリンクする必要があり、その後CRTライブラリをリンクすることができました。
Yucko Microsoft !!