1

可能重复:
为什么在使用模板时会出现“未解析的外部符号”错误?

我的解决方案分为 3 个项目。第一个是 MFC (GUI) 应用程序,第二个是静态库,第三个是 DLL。DLL 依赖于静态库,而 GUI 依赖于两者。这里的想法是编写一个带有演示插件 (DLL) 的 SDK(静态库),MFC (GUI) 应用程序使用该插件。

话虽如此,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()within的实现SdkHookMgr.h呢?构建静态库的目的是首先避免插件开发人员戳 SDK 的源代码......

4

0 回答 0