【问题标题】:Compiler Linker External Symbol Mhook_SetHook编译器链接器外部符号 Mhook_SetHook
【发布时间】:2017-09-09 16:10:29
【问题描述】:

Visual Studio 2017(全新安装-命令行版本)报错:

LNK2019:函数 wmain 中引用的未解析外部符号 Mhook_SetHook LNK2019:函数 wmain 中引用的未解析的外部符号 Mhook_UnHook

编译命令:cl /Y- /EHsc /DUNICODE mhook-test.cpp gdi32.lib user32.lib

我认为这可能与C/C++混淆有关,所以我修改了mhook.h如下:

#ifdef __cplusplus
extern "C" {
#endif

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

#ifdef __cplusplus
} // extern "C"
#endif

这对结果没有影响。

我不明白为什么链接器有问题。

mhook-test.cpp 与 mhook 库一起提供。

【问题讨论】:

  • 检查 c++ 名称修改。如果该库是使用 C++ 编译器编译的,extern "C" 在这里可能是错误的。
  • 您的 .h 文件基本上说“有一个名为 Mhook_SetHook 的函数,但它是在其他地方定义的”。您没有向链接器提供“其他地方”。您正在链接 gdi32.lib 和 user32.lib 但不是 mhook.lib。所以当然链接器找不到它。
  • @HansPassant:我认为这可能是问题所在,但我只有 mhook 库的源代码,而不是库本身。换句话说,我没有“mhook.lib”文件;我以为它会与测试程序一起创建?
  • 你没有编译它。学习如何在 Visual Studio 中使用项目,项目避免许多新手错误。

标签: c++ visual-studio linker


【解决方案1】:

mhook 库不是分布式预编译的;它必须被编译成库,然后可以指定给链接器。

所以,对于mhook目录的源代码中的每个“.c”和“.cpp”文件:

"首先,运行 cl /c /EHsc MathFuncsLib.cpp 来编译代码并创建一个名为 MathFuncsLib.obj 的目标文件。(cl 命令调用编译器 Cl.exe,并且 /c 选项指定编译不链接)。其次,运行 lib MathFuncsLib.obj 链接代码并创建静态库 MathFuncsLib.lib。 - https://msdn.microsoft.com/en-us/library/ms235627.aspx

然后必须为最终编译命令指定这些:“cl /Y- /EHsc /DUNICODE /D_UNICODE mhook-test.cpp gdi32.lib user32.lib mhook.lib disasm.lib misc.lib disasm_x86.lib cpu。库”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-26
    • 2022-01-15
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多