webdancer's Blog
Makefile文件的书写
学习分析源代码,和自己在Linux底下Makefile文件的书写很重要。但是,这是一个逐渐积累的过程,先学一下基本的吧!
Makefile的语法较为复杂,可以参考GNU的官网。http://www.gnu.org/software/make/manual/make.html
1.make命令不仅使用在编译类型的程序文件,还是用于有几个输入文件产生输出文件的情况;比如是文档处理。
2.Makefile语法:
一个Makefile文件包含:依赖关系和规则. 一条依赖关系包含目标文件和它所依赖的源文件.规则:描述了如何由源文件产生目标文件。
目标文件: 源文件1 源文件2 [...]
<tab> 规则 #(注:此处必须是tab键打头)。
(1.)依赖关系:
目标文件产生所依赖的源文件,两者用:与空格分开;格式为:
目标文件: 源文件1 源文件2 […]
例如:
all: main.o 1.o 2.o
main.o: main.c a.h
1.o: 1.c a.h
2.o: 2.c b.h
注意: 在gcc 编译器中有 -MM选项,它可以产生依赖关系。所以,把它产生的输出到某个文件就可以了。
(2)规则:
产生目标文件的语法,可以使用gcc 命令。格式为:
<tab> rules
3.#为注释。从行首到行末。
4.Makefile文件里的宏。
MACRONAME=VALUE
使用时${MACRONAME} 或者 $(MACRONAME)
宏经常用在编译器的选项上。
在make执行shell命令时,每一条命令会打开一个shell,所以加\來连接。
自定义变量:
AR 库文件维护程序的名称,默认值为 ar
AS 汇编程序的名称,默认值为 as
CC C 编译器的名称,默认值为 cc
CPP C 预编译器的名称,默认值为$(CC) –E
CXX C++编译器的名称,默认值为 g++
FC FORTRAN 编译器的名称,默认值为 f77
RM 文件删除程序的名称,默认值为 rm –f
ARFLAGS 库文件维护程序的选项,无默认值
ASFLAGS 汇编程序的选项,无默认值
CFLAGS C 编译器的选项,无默认值
CPPFLAGS C 预编译的选项,无默认值
CXXFLAGS C++编译器的选项,无默认值
FFLAGS FORTRAN 编译器的选项,无默认值
自动变量:
$* : 不包含扩展名的目标文件名称。
$+ : 所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件。
$< : 第一个依赖文件的名称 。
$? : 所有时间戳比目标文件晚的依赖文件,并以空格分开
$@: 目标文件的完整名称
$^ : 所有不重复的依赖文件,以空格分开
$% : 如果目标是归档成员,则该变量表示目标的归档成员名称
5。内建规则:
模式规则是用来定义相同处理规则的多个文件的。它不同于隐式规则,隐式规则仅仅能够用 make 默认的变量来进行操作,而模式规则还能引入用户自定义变量,为多个文件建立相同的规则,从而简化 Makefile 的编写。
模式规则的格式类似于普通规则,这个规则中的相关文件前必须用“%”标明。使用模 式规则修改后的 Makefile 的编写如下:
OBJS = kang.o yul.o
CC = Gcc
CFLAGS = -Wall -O -g
sunq : $(OBJS)
$(CC) $^ -o $@
%.o : %.c
$(CC) $(CFLAGS) -c $< -o $@
6.make 管理函数库:
函数库是一种目标文件的集合,后缀.a。make语法使得管理变得很简单,语法为:lib(file.o),可以把文件加入到函数库中。
7.make使用:
-C dir 读入指定目录下的 Makefile
-f file 读入当前目录下的 file 文件作为 Makefile
-i 忽略所有的命令执行错误
-I dir 指定被包含的 Makefile 所在目录
-n 只打印要执行的命令,但不执行这些命令
-p 显示 make 变量数据库和隐含规则
-s 在执行命令时不显示命令
-w 如果 make 在执行过程中改变目录,则打印当前目录名。