1

重複の可能性:
テンプレートを使用すると「未解決の外部シンボル」エラーが発生するのはなぜですか?

私のソリューションは 3 つのプロジェクトに分割されています。1 つ目は MFC (GUI) アプリ、2 つ目は静的ライブラリ、3 つ目は DLL です。DLL は静的ライブラリに依存し、GUI は両方に依存します。ここでのアイデアは、MFC (GUI) アプリが使用するデモ プラグイン (DLL) を備えた SDK (静的ライブラリ) を作成することでした。

そうは言っても、SDK には、プラグイン開発者がフックするプロトタイプ関数を選択できるようにするテンプレート関数が含まれています。しかし、dllとlibの実装に問題があるようです...

SdkLib.h:

#define MY_EXPORTS
#include "SdkHookMgr.h"

// Prototypes
typedef HMODULE (WINAPI *HookLoadLibraryA)( LPCSTR lpFileName );
typedef HMODULE (WINAPI *HookLoadLibraryW)( LPWSTR lpFileName );

SdkHookMgr.h:

#ifdef MY_EXPORTS
    #define MY_API  __declspec(dllexport) WINAPI
#else
    #define MY_API  WINAPI
#endif

template <typename HookFunction>
BOOL MY_API Hook(HookFunction Target);

SdkHookMgr.cpp:

#include "SdkHookMgr.h"
template <typename HookFunction>
BOOL MY_API Hook(HookFunction Target)
{
    switch( typeid(Target) )
    {
    case HookLoadLibraryA:
        // Use private SDK functions to hook LoadLibraryA
        break;
    case HookLoadLibraryW:
        // Use private SDK functions to hook LoadLibraryW
        break;
    //...
    default:
        return FALSE;
    }
    return TRUE;
}

demodll.cpp:

#include <SdkLib.h>

HMODULE WINAPI Hooked_LoadLibraryA ( LPCSTR lpFileName )
{
    //...
}

//...
Hook<HookLoadLibraryA>(Hooked_LoadLibraryA);



ここでの問題は、lib は正常にコンパイルされますが、dll には次のように表示されることです。  

demodll.obj : error LNK2019: unresolved external symbol "int __stdcall Hook<struct HINSTANCE__ * (__stdcall*)(char const *)>(struct HINSTANCE__ * (__stdcall*)(char const *))"

 
何が起こっているのかと思いますが、lib は の実装を認識していますSdkHookMgr.cppが、dll は認識していません (sdklib.lib とリンクしているにもかかわらず)。Hook()関数を呼び出すときに、開発者が同じシグネチャを持つプロトタイプと関数を使用するように制限するというアイデアは本当に楽しかったHook()ですSdkHookMgr.h。静的ライブラリを構築するポイントは、そもそもプラグイン開発者が SDK のソース コードを突っ込まないようにすることでした...

4

0 に答える 0