web-dev-qa-db-ja.com

エラーLNK2005:_DllMain @ 12はMSVCRT.libで既に定義されています

このリンカーエラーが発生します。

mfcs80.lib(dllmodul.obj):エラーLNK2005:_DllMain @ 12はMSVCRT.lib(dllmain.obj)で既に定義されています

このバグを解消する正しい方法を教えてください。このバグについてマイクロソフトサポートサイトで解決策を読みましたが、あまり役に立ちませんでした。

VS 2005とPlatform SDKを使用しています

32
mahesh

リンカエラーをよく読み、知識を適用すると、次のようになります。

リンカは、コンパイルされた多数のオブジェクトとライブラリをリンクして、バイナリを取得します。

各オブジェクト/ライブラリは、

  • 他のオブジェクトに存在すると予想される記号
  • それが定義する記号

2つのオブジェクトが同じシンボルを定義している場合、このリンカーエラーが発生します。あなたの場合、mfcs80.libとMSVCRT.libの両方が_DllMain @ 12シンボルを定義しています。

エラーを取り除く:

  1. 両方のライブラリのどちらが実際に必要かを調べる
  2. リンカに他のリンカを使用しないように指示する方法を見つけます(例: James Hopkinからのヒント を使用)
14
xtofl

私は同じエラーメッセージを受け取りましたが、ここでの答えのどれも私のためにそれを解決しませんでした。したがって、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つだけ表示し、不平を言うことはありません。

出典: http://social.msdn.Microsoft.com/Forums/en-US/0d78aa6b-1e87-4c01-a4a7-691335b7351a/how-to-build-mfc-application-dll-in-visual- c-201

41
Constantin

独自のDllMainを定義している場合は、プロジェクト設定で、[構成プロパティ/全般]の[MFCの使用]を[標準のWindowsライブラリを使用]に設定する必要があります。

変更後は、クリーンな再構築を行う必要があります。

11
James Hopkin

私のプロジェクトでは、プロジェクト設定に追加の依存関係として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 、ただし[特定のデフォルトライブラリを無視する]ボックスに何も入力する必要はありませんでした。

8
vmb100

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の実装も含まれているため、競合が発生します。

3
Bill

ATLプロジェクトでこのエラーが発生しているすべての人(主にMFCサポートを追加しようとしたとき)のために、私が苛立たしい日々の後に見つけた解決策を次に示します!

まず第一に、 このリンク は他のすべてのものより私に役立ちました。それは私を正しい方向に向けました。何らかの理由で「生成されたファイル」(タイプGUIDと同じようにプロキシとスタブコードを含む)が削除され、プロジェクトに再度追加された場合に、問題が発生します。これにより、Visual Studioは間違った順序でそれらを追加します!

通常、最初に「ATLにはC++コンパイルが必要です」というエラーが表示されますが、そのファイルのYc/Yu(プリコンパイル済みヘッダー)設定を無効にすることでこれを修正した可能性があります。

次にすべきことは、プロジェクトをアンロードして編集することです。ビルドとインクルード順序(ClCompileおよびClInclude)を定義するアイテムグループを検索します。注文と設定を確認してください。

コンパイルは次の順序で表示されます。

  1. dllmain.cppCompileAsManagedfalseに設定し、PrecompiledHeaderを空のままにします)。
  2. ライブラリソース(MyLib.cppDllCanUnloadNowなどを含む)
  3. プロキシ/スタブコード(MyLib_i.c; dllmain.cppと同じ設定)
  4. stdafx.cppPrecompiledHeaderCreateに設定して)
  5. 他のすべてのライブラリソースファイル(実際のライブラリコンテンツ)
  6. xdlldata.cdllmain.cppと同じ設定)

インクルードは次のように並べる必要があります。

  1. dllmain.h
  2. MyLib_i.h
  3. Resource.h
  4. stdafx.h
  5. targetver.h
  6. ...(実際のライブラリヘッダー)
  7. xdlldata.h

ビルド順序を修正するとプロジェクトが修正され、新しいクリーンビルドを作成できました。

3
Carsten

非常に似た問題があります。 [mfcs110d.lib(dllmodul.obj):エラーLNK2005:_DllMain @ 12はMSVCRTD.lib(dllmain.obj)で既に定義されています]と解決策は追加の依存関係にmfcs110d.libを追加

私の場合、プリプロセッサディレクティブに問題がありました。何らかの理由で _USRDLLが定義されるべきではありませんでした。

これを確認するには、メニューに移動します Project 、 選択する Project Properties 、次にスニペットを選択します Configuration Properties -> Preprocessor 。

プリプロセッサディレクティブはそこにあります。

2
joan

私はこの方法で個人的にこのエラーを取り除きました:Solution Explorerでプロジェクトを右クリックし、ポップアップメニューからPropertiesを選択し、Linkerタブをクリックしてmfcs71ud.libAdditional Dependenciesに追加しました。 Visual Studio 2005を使用している場合は、「71」ではなく「80」にする必要があります。

1
izogfif

ただ#undef_USRDLL含める前にafx.hまたはそれ以上に、プロジェクト構成を編集してマクロを削除します。

これは、MFC拡張DLLの通常の構成です。 MFC DLLのビルド設定

1
mgruber4

各.cppファイルの先頭に「Stdafx.h」が含まれていることを確認してください。まったく同じエラーが発生し、このヘッダーがまったく含まれていない単一の.cppファイルがありました。 #includeを追加することで問題は解決しました。

1
Matt Davis

ここでいくつかの答えを実行する共通のテーマがあります。

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を追加の依存関係に追加しました

したがって、一般的なケースは、追加するライブラリの名前を最初に見つけることです...

Library name

そしてそれを追加する...

Add Library to Dependencies

前提条件 および/または 代替 の解決策があるように見えることに注意してください。

0
Ivan

ここに解決策が見つかりました Visual Studio 2010ライブラリのリンク順

これは、リンカオプションの/ FORCE:MULTIPLEです。

[module(name = "mymodule")]を使用するには、ATLとMFCを混在させる必要がありました。 「__hook」キーワードを使用したMFCアプリケーションでの構築

0
Serov Danil

この問題を解決するには、mfc80ud.libmfcs80ud.libフィールドでAdditional DependanciesProject Properties -> Linker Tab -> Input of Visual Studioを宣言してください。

0
Avishek Bose

私はこれを助けました: http://support.Microsoft.com/kb/148652

基本的に、リンカーの順序は正しくありませんでした。 CRTライブラリはMFCライブラリの前にリンクされていました。結局のところ、MFCライブラリは最初にリンクする必要があり、その後CRTライブラリをリンクすることができました。

Yucko Microsoft !!

0
C Johnson