写下怎么配置vc的环境吧,不过网上这方面的文章很多了,我就不写重复的东西了,讲符号配置顺延。
怎样配置vc的环境来编译驱动
最好用vc 7.0来编译驱动,6.0的编译器没有7.0的编译器好,编译器用的越新越好,驱动和普通的程序没有什么区别
在开始讲如何配置环境前,先想想自己要编译程序,需要让编译器知道哪些东西?
1.头文件和库路径,如果是编译应用程序,这个你就不用管了,默认的路径已经配置好了
编译驱动的话,多增加头文件和库的路径,这里用我自己的机器环境,具体的情况,根据你的安装目录来更改
include
D:/WINDDK/2600/inc/ddk/w2k
D:/WINDDK/2600/inc/w2k
lib
D:/WINDDK/2600/lib/w2k
如果要编译xp下的驱动的话,把w2k更改为wxp
2.编译选项(cl.exe 后面跟的参数)
debug模式
/nologo 不让我们的设置(cl.exe 后面跟的参数)输出到输出窗口
/Gz 采用stdcall调用方式,还有_fastcall, _cdecl _pascal调用方式
/MLD 用的单线程调试版运行库
/W3 警告级别
/Zi 创建.PDB文件记录所有调试信息
/Od 不允许优化
/c 仅仅生成obj,需要link程序来连接
其中还有一些其他选项,可以在设置属性页里面选择,例如:
/Fo"Release/" 表示中间生成的obj存放的目录
/Fd"Release2K/vc70.pdb" 表示程序名字数据库文件
还需要定义一些宏,宏才是最重要的,这个用来指导编译器用哪些windows结构,怎么来生成适合windows的代码。
WINVER=0x500; 指定你需要编译的驱动运行在2k下,0x501是xp,0x502是2k3,具体的看msdn
DEBUG;_DEBUG;DBG;调试版本,有调试输出
UNICODE; 驱动是unicode,WCHAR会被定义为2个字节
_X86_; 生成驱动必须的,如果是应用程序的话,对应 _WINDOWS 这个宏
STD_CALL; 采用 stdcall调用方式,不过这个在编译选项里面已经指定了
WIN32_LEAN_AND_MEAN; 用来减少编译时间的
NT_UP; 你的驱动能运行在多处理器上,定义NT_UP=0
release模式
/MLD 变成 /ML 用单线程运行库
/Od 变成 ? 你自己看着办吧,编译驱动尽量不开优化,有以下优化选项
/Os:更小的大小
/Ot:更快的速度
/Og:全局优化
/GF 增加,合并重复的字符串
/Oi 使用内部函数替换一些函数的调用
内联函数扩展的三种优化,使用内联函数可以节省函数调用的开销:
什么都不加,表示不使用内联
/Ob1 仅函数定义前有inline或__inline标记使用内联
/Ob2 除了inline或__inline标记的函数外,编译器“觉得”应该使用内联的函数,都使用内联
/Oy 不使用帧指针,以提高函数调用速度
还有一个总的优化选项,四选一
/Od 不允许优化
/O1 更小的大小
/O2 更快的速度
/Ox 完全优化
是不是都被这些优化搞晕了,link里面也还有优化,呵呵
DEBUG;_DEBUG;DBG;把这三个宏去掉
3.连接选项(link.exe 后面跟的参数)
debug模式
/OUT:"debug/???.sys"
/INCREMENTAL:NO
/NOLOGO 不让我们的设置(link.exe 后面跟的参数)输出到输出窗口
/ENTRY:"DriverEntry" 指定入口
/BASE:"0x10000" 生成驱动必须指定为该基址
/MACHINE:X86 在intel上跑
/driver 生成驱动
/subsystem:native 生成驱动
/DEBUG "/PDB:debug/???.pdb" 这个用来生成符号文件,但是这样的话,你编译生成的驱动里面会含有这个pdb的绝对路径,不知道怎么做和微软一样的符号文件。有知道的兄弟告诉我一声哈:)。
注:windbg里面,symstore.exe可以完成这个任务,自己没有用过,主要用于很大的公司发布自己产品的pdb文件,命令行如下:
symstore add /r /f d:/build/release/*.PDB /s e:/symbols /t "MyApp" /v "Build 632"
release模式
/OUT:"debug/???.sys" ---> /OUT:"release/???.sys"
还可以增加优化选项
/opt:ref 省略没有引用的数据
/opt:icf 省略冗余数据
也可以选择生成pdb文件,参数和上面的一样(/DEBUG "/PDB:debug/???.pdb"),方便自己在release模式下的源代码级调试,this is perfect!!!
ps:其中cl.exe link.exe里面的参数还有很多,自己可以看着msdn学习
自己以前写驱动的时候,不知道开了一个什么优化,把我写的一个函数给优化掉了,结果在其他模块调去调用这个函数,结果可想而知了。花了不少时间才发现这个问题。
看完后,请点下左边的广告,谢谢!!