可能重复:
Why do I get “unresolved external symbol” errors when using templates?
我的解决方案分为3个项目。第一个是MFC(GUI)应用程序,第二个是静态库,第三个是DLL。 DLL依赖于静态lib,GUI依赖于两者。这里的想法是编写一个SDK(静态库),其中包含一个MFC(GUI)应用程序使用的演示插件(DLL)。
话虽如此,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()
函数时限制开发人员使用具有相同签名的原型和函数的想法,并且认为模板是最好的方法...... 但我怎样才能绕过这个漏洞< / strong>而不必在Hook()
中包含SdkHookMgr.h
的实施?构建静态库的目的是为了避免插件开发人员首先使用SDK的源代码...