一、gcc编译流程
二、Makefile:make 是个命令,是个可执行程序,用来解析 Makefile 文件的命令,这个命令存放在 /usr/bin/。makefile 是个文件,这个文件中描述了咱们程序的编译规则
①
变量的作用:
保存文件名列表
保存文件目录列表
保存编译器名
保存编译参数
保存编译的输出
引用自定义变量:
(
变
量
名
)
或
(变量名)或
(变量名)或{变量名}
② 预定义变量
$@ 目标名
$< 依赖文件列表中的第一个文件
$^ 依赖文件列表中除去重复文件的部分
③
三、独立编译内核加载模块的Makefile
①#this is a makefile
ifneq ($(KERNELRELEASE),)
param-objs := file1.o file2.o
obj-m := param.o
else
KDIR := /lib/modules/2.6.18-53.el5/build
all:
make -C
(
K
D
I
R
)
M
=
(KDIR) M=
(KDIR)M=(PWD) modules
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
解释:KERNELRELEASE是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此Makefile时,KERNELRELEASE没有被定义,所以make将读取执行else之后的内容,如果make的目标是clean,直接执行clean操作,然后结束。当make的目标为all时,-C
(
K
D
I
R
)
指
明
跳
转
到
内
核
源
码
目
录
下
读
取
那
里
的
M
a
k
e
f
i
l
e
;
M
=
(KDIR)指明跳转到内核源码目录下读取那里的Makefile;M=
(KDIR)指明跳转到内核源码目录下读取那里的Makefile;M=(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile。当从内核源码目录返回时,KERNELRELEASE已被定义,kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。else之前的内容为kbuild语法的语句,指明模块源码中各文件的依赖关系,以及要生成的目标模块名。param-objs := file1.o file2.o 表示param.o由file1.o与file2.o 连接生成,obj-m := param.o表示编译连接后将生成param.o模块
②
KERNDIR:= /lib/modules/uname -r
/build
PWD:= pwd
obj-m:=demo.o
module:
make -C
(
K
E
R
N
D
I
R
)
M
=
(KERNDIR) M=
(KERNDIR)M=(PWD) modules
clean:
make -C
(
K
E
R
N
D
I
R
)
M
=
(KE RNDIR) M=
(KERNDIR)M=(PWD) clean