编译Windows驱动遇LNK2019错误:ntoskrnl.lib符号无法解析
手动编译X86 WDM驱动时LNK2019符号未解析问题解决
问题场景
在Windows 10环境下,使用cl.exe手动编译纯C编写的X86架构WDM驱动,基于Enterprise WDK(RS1版本14393),全程不依赖msbuild或Visual Studio项目。编译阶段正常,但链接时出现IoCreateDevice、IoDeleteDevice符号未解析错误。
初始编译链接脚本
cl ^ /c /KERNEL /GS- /Tc ^ filter.c ^ /I"D:\Downloads\EnterpriseWDK_rs1_release_14393_20160715-1616\Program Files\Windows Kits\10\Include\10.0.14393.0\km" link filter.obj ^ "D:\Downloads\EnterpriseWDK_rs1_release_14393_20160715-1616\Program Files\Windows Kits\10\Lib\10.0.14393.0\km\x86\fwpkclnt.lib" ^ "D:\Downloads\EnterpriseWDK_rs1_release_14393_20160715-1616\Program Files\Windows Kits\10\Lib\10.0.14393.0\km\x86\wdm.lib" ^ "D:\Downloads\EnterpriseWDK_rs1_release_14393_20160715-1616\Program Files\Windows Kits\10\Lib\10.0.14393.0\km\x86\ntoskrnl.lib" ^ /SUBSYSTEM:NATIVE /ENTRY:DriverEntry /DRIVER:WDM /KERNEL /VERBOSE /MACHINE:X86 /BASE:0x1000 /NODEFAULTLIB
链接错误信息
filter.obj : error LNK2019: unresolved external symbol __imp__IoCreateDevice referenced in function _DriverEntry filter.obj : error LNK2019: unresolved external symbol __imp__IoDeleteDevice referenced in function _unload Unused libraries: D:\Downloads\EnterpriseWDK_rs1_release_14393_20160715-1616\Program Files\Windows Kits\10\Lib\10.0.14393.0\km\x86\ntoskrnl.lib
排查步骤
- 确认链接器已扫描
ntoskrnl.lib,通过dumpbin.exe验证该库包含_IoCreateDevice@28符号 - 确认
wdm.h头文件中已正确声明IoCreateDevice函数 - 尝试用
#pragma comment(lib, "ntoskrnl.lib")指定库链接顺序,无效果
解决方案
在编译命令中添加/Gz选项,强制函数调用采用__stdcall调用约定,替换默认的__cdecl,修正符号名的匹配问题。修改后的编译命令如下:
cl ^ /c /KERNEL /GS- /Tc /Gz ^ filter.c ^ /I"D:\Downloads\EnterpriseWDK_rs1_release_14393_20160715-1616\Program Files\Windows Kits\10\Include\10.0.14393.0\km"
重新执行编译和链接后,驱动可正常生成并安装。
内容的提问来源于stack exchange,提问作者amm
相关产品推荐
相关产品推荐

