1

在我的 Visual Studio 2010 中有 2 个项目。一个是静态库(如果有人问,mhook 2.3),另一个是 DLL。两者都设置为编译为 /MT。

mhook 项目在其 mhook.h 中有两个函数:

BOOL Mhook_SetHook(PVOID *ppSystemFunction, PVOID pHookFunction);
BOOL Mhook_Unhook(PVOID *ppHookedFunction);

dll 项目引用了 mhook 项目并同时使用了 Mhook_SetHook 和 Mhook_Unhook。使用相同的 mhook.h。当我编译 dll 项目时,我收到以下错误:

1>hookdll.obj : error LNK2001: unresolved external symbol _Mhook_Unhook

注意,链接成功找到了 Mhook_SetHook。如果我注释掉 Mhook_Unhook 的使用,程序编译成功。

Dumpbin 建议这两个符号都存在于静态库中:

>dumpbin /symbols mhook-test.lib|find "Mhook"
015 00000000 SECT4  notype ()    External     | ?Mhook_SetHook@@YAHPAPAXPAX@Z (i
nt __cdecl Mhook_SetHook(void * *,void *))
122 00000000 SECT3B notype ()    External     | ?Mhook_Unhook@@YAHPAPAX@Z (int _
_cdecl Mhook_Unhook(void * *))
>

我迷茫和困惑,请帮助。

4

1 回答 1

1

回答:我显然是在混合 C++ 和 C 代码——手头的库是 C++,我的程序是 C。

我不得不在它周围添加 extern C,从这个Using C++ library in C code中收集到:

#ifdef __cplusplus
extern "C" {
#endif
BOOL Mhook_SetHook(PVOID *ppSystemFunction, PVOID pHookFunction);
BOOL Mhook_Unhook(PVOID *ppHookedFunction);
#ifdef __cplusplus
} // extern "C"
#endif

完成后,我的符号导出开始看起来好多了:

C:\Users\MACABRE\Documents\Visual Studio 2010\Projects\luahooker\Debug>dumpbin /
exports mhook.lib
Microsoft (R) COFF/PE Dumper Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file mhook.lib

File Type: LIBRARY

     Exports

       ordinal    name

                  _Mhook_SetHook
                  _Mhook_Unhook
于 2012-04-17T06:16:25.747 回答