VS2019开发KMDF驱动引入DMF库报错,求正确配置方法
KMDF驱动项目引入DMF编译错误的解决方法
问题背景
使用Visual Studio 2019开发Windows 10 KMDF驱动时,参考同类项目做法,已将DMF克隆到同目录并完成多架构编译,但自行配置包含目录、库目录后,编译原本正常的驱动出现200+错误(如重定义、语法错误等),仅在使用DMF API时触发。
自行配置的内容:
- 包含目录(C/C++ -> 常规 -> 附加包含目录):
C:\Users\me\source\repos\KMDF\DMF\Dmf\FrameworkC:\Users\me\source\repos\KMDF\DMF\Dmf\Modules.LibraryC:\Users\me\source\repos\KMDF\DMF\Dmf\Modules.Library.TestsC:\Users\me\source\repos\KMDF\DMF\Dmf\Modules.Template
- 库目录(链接器 -> 常规 -> 附加库目录):
C:\Users\me\source\repos\KMDF\DMF\Release\x64\lib\DmfK
- 附加依赖项(链接器 -> 输入 -> 附加依赖项):
DmfK.lib
部分错误示例:
Severity Code Description Project File Line Suppression State Error (active) E1389 redeclaration cannot add dllexport/dllimport to "WdmlibRtlInitUnicodeStringEx" (declared at line 417 of "C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\km\wdmsec.h") KMDF C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\km\ntifs.h 2417 Error C2371 'PEPROCESS': redefinition; different basic types KMDF C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\km\ntifs.h 85 Error C2371 'PETHREAD': redefinition; different basic types KMDF C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\km\ntifs.h 86 Error C2375 'WdmlibRtlInitUnicodeStringEx': redefinition; different linkage KMDF C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\km\ntifs.h 2417 Error C2061 syntax error: identifier 'BufferPool_SourceSettings' KMDF C:\Users\me\source\repos\KMDF\DMF\Dmf\Modules.Library\Dmf_BufferQueue.h 43 Error C2059 syntax error: '}' KMDF C:\Users\me\source\repos\KMDF\DMF\Dmf\Modules.Library\Dmf_BufferQueue.h 47 Error C2143 syntax error: missing ')' before '*' KMDF C:\Users\me\source\repos\KMDF\DMF\Dmf\Modules.Library\Dmf_BufferQueue.h 56 Error C2143 syntax error: missing '{' before '*' KMDF C:\Users\me\source\repos\KMDF\DMF\Dmf\Modules.Library\Dmf_BufferQueue.h 56 Error C2059 syntax error: ')' KMDF C:\Users\ME\source\repos\KMDF\DMF\Dmf\Modules.Library\Dmf_BufferQueue.h 57
正确的DMF引入配置步骤
1. 精简并调整包含目录
删除Modules.Library.Tests和Modules.Template目录(测试、模板模块无需引入),仅保留必要目录:
C:\Users\me\source\repos\KMDF\DMF\Dmf\FrameworkC:\Users\me\source\repos\KMDF\DMF\Dmf\Modules.Library
关键操作:在VS中将这两个目录的优先级调整为低于Windows SDK包含目录(通过上移/下移按钮调整),避免头文件加载顺序冲突导致重定义。
2. 添加预处理器定义
在项目属性 -> C/C++ -> 预处理器 -> 预处理器定义中添加:
DMF_IN_DRIVER- 确保与DMF编译时的预处理器定义一致(如
_WIN64等平台宏)
3. 优化库目录与依赖项
- 库目录避免硬编码路径,使用VS宏适配不同配置:
$(SolutionDir)..\DMF\$(Configuration)\$(Platform)\lib\DmfK
- 附加依赖项保留
DmfK.lib,但需确保当前项目的配置(Debug/Release)、平台(x64/Win32)与DMF编译产物完全匹配。
4. 规范头文件引入
不要单独引入DMF单个头文件,统一在驱动主头文件或源文件顶部引入:
#include <DmfModules.Library.h>
该头文件会自动加载所有必要的框架和库模块头文件,避免依赖缺失引发语法错误。
5. 验证版本一致性
确认DMF的DmfK项目编译时使用的Windows SDK版本、KMDF版本与当前驱动项目完全一致,版本不匹配会导致大量编译错误。
内容的提问来源于stack exchange,提问作者IgnoreExeption
相关产品推荐
相关产品推荐

