37

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

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

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

PlatformSDKでVS2005を使用しています

4

17 に答える 17

48

同じエラーメッセージが表示されましたが、ここでの回答はどれも解決しませんでした。したがって、MFC を使用する DLL プロジェクトを作成するときにその問題が発生した場合は、次の行を入力することで解決できます。

extern "C" { int _afxForceUSRDLL; } 

DllMainが定義されている cpp ファイルに追加します。次に、DllMaindllmain.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 のみを参照し、文句を言うことはありません。

ソース: http://social.msdn.microsoft.com/Forums/en-US/0d78aa6b-1e87-4c01-a4a7-691335b7351a/how-to-build-mfc-application-dll-in-visual-c-2010

于 2013-11-12T13:25:28.287 に答える
16

リンカのエラーをよく読んで知識を適用すれば、自分でそこにたどり着けるかもしれません:

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

各オブジェクト/ライブラリの説明

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

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

エラーを取り除く:

  1. 両方のライブラリのどちらが実際に必要かを調べる
  2. リンカーに他のものを使用しないように指示する方法を見つけてください (たとえば、James Hopkin からのヒントを使用して)
于 2008-12-05T10:47:31.430 に答える
11

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

変更後は、クリーン リビルドを行う必要があります。

于 2008-12-05T10:24:16.750 に答える
9

私のプロジェクトでは、プロジェクト設定に追加の依存関係として 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で提案されているものとほぼ同じですが、[特定の既定のライブラリを無視する] ボックスに何も入力する必要はありませんでした。

于 2012-07-05T12:16:22.963 に答える
4

ATL プロジェクトでこのエラーが発生しているすべての人 (主に MFC サポートを追加しようとしている場合) のために、何日もフラストレーションを感じた後に見つけた解決策を次に示します。

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

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

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

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

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

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

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

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

于 2015-01-13T10:08:43.000 に答える
3

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

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

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

于 2014-08-19T17:54:05.077 に答える
3

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

于 2016-06-10T02:21:39.460 に答える
3

私は非常によく似た問題を抱えています。[mfcs110d.lib(dllmodul.obj) : エラー LNK2005: _DllMain@12 は既に MSVCRTD.lib(dllmain.obj) で定義されています] および解決策は、追加の依存関係に mfcs110d.lib を追加することでした

于 2014-04-24T07:25:49.760 に答える
3

を含める直前#undef、またはさらに良いことに、プロジェクト構成を編集してマクロを削除します。_USRDLLafx.h

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

于 2015-12-02T23:00:51.197 に答える
2

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

于 2013-04-20T19:50:49.623 に答える
2

これが役に立ちました: http://support.microsoft.com/kb/148652

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

ユッコマイクロソフト!!

于 2014-10-22T17:03:30.997 に答える
2

問題を修正するには、 のフィールドでmfc80ud.libandを宣言します。mfcs80ud.libAdditional DependanciesProject Properties -> Linker Tab -> Input of Visual Studio

于 2015-10-09T04:10:10.953 に答える