DDK通过调用build工具进行编译以及链接代码,而build又是通过传递一些编译的参数调用nmake工具进行解析makefile文件(其中,makefile文件中指定了需要编译的文件的依赖关系,指定的过程是有顺序的,要指明先编译哪些文件,后编译哪些文件;不管是build,还是nmake,甚至是VC,它们最终调用的都是cl.exe和link.exe),传参很多,可以自己查询文档;这里边makefile需要列出一系列的依赖关系,从头写makefile会很烦人,大多数情况下我们只需要写一行:
! INCLUDE $(MAKEENVNT) \makefile.def,想要深入了解去MSDN上看一下,我之后有时间或者遇到这方面的需要的时候再深入看了。
有了自定义的编译依赖关系或者使用默认的makefile之后,得告诉build编译哪些文件,这些文件的路径在哪,这就遇到了source和 dirs文件。source里边记录了需要编译的源文件文件名、包含目录路径、库目录路径等,有了目标才能进行编译是吧?而具体设置自己查询文档,继续说整体流程;多数项目不可能仅仅用了一个文件夹,这就遇到了需要编译的文件放在不同位置,也就有了dirs文件,这个里边描述了需要编译的子目录路径,这样build会依次进入dirs里边写的子目录寻找source进而将所有需要编译的文件都编译,生成需要的静态库*.lib等等。
整体流程说完了,具体说一下:
001:生成静态库的准备:
先设置makefile为默认的那一行,之后编写dirs和source文件
dirs很简单,比如:
DIRS=\
filepath1\
filepath2\
filepath3\
filepath4\
filepath5\
右边的'\'出现在结尾,表示下一行与本行是一行,只不过分行写,看着清晰
然后具体说一下source:
TARGETNAME:目标驱动的名称
TARGETTYPE:目标代码生成类型,写成DRIVER表示驱动,PROGRAM表示编译成Win32程序
TARGETPATH:目标代码生成的路径
C_DEFINES :相当于C语言中的#define,不过这里边比如宏定义MY_TYPE,需要前边加一个"-D",比如这样:C_DEFINES = -DMY_TYPE1 -DMY_TYPE2
TARGETLIBS:设置代码所需要的库
SOURCES:指定此工程需要的所有源文件,只指定C和C++文件,不需要头文件,比如:
SOURCES=a.c\
b.c++\
c.c\
注意前边是TAB不是空格,否则不识别,报错
002:设置编译环境,平台等:
使用的的是DDK里边setenv.bat , 一般这样调用:
call %DDKROOT%\bin\setenv.bat %DDKROOT% %1 %2 %3
其中,DDKROOT是环境变量,一般为:C:\WinDDK\600
%1是编译方式,chk或者fre,分别对应VC编译中我们熟悉的debug和release版本
%2是处理器,一般为x86、x64、ia64、AMD64
%3是操作系统,一般有:WXP , WIN7 , WLH
call 了setenv.bat之后就可以编译了:
build /c /w /g
/c 表示只进行编译,不进行链接
/w 表示采用第三集警报模式
/g 表示默认函数采用标准调用(__stdcall)
这样就编译出来了想要的静态库*.lib了。
003:
生成驱动:
将编译好的静态库拷贝到最终编译生成驱动的设置的静态文件的目录下,之后使用命令:
build -b -w WXP -nmake /a
这行批处理所在的目录为source目录下,最终就生成了需要的编译结果:目标驱动,具体细节我也在学习中,初学者,肯定会有理解不到位的地方,希望发现问题的朋友不吝提醒,谢谢。