Makefile文件的构成——条件语句、库使用
1、条件语句
(1)比较条件
ifeq($(CC),gcc) # ifneq() 不相等
libs=...
eles
libs=...
endif
...
(2)定义条件
ifdef 变量名 # 变量已定义
ifndef 变量名
1、条件语句
(1)比较条件
ifeq($(CC),gcc) # ifneq() 不相等
libs=...
eles
libs=...
endif
...
(2)定义条件
ifdef 变量名 # 变量已定义
ifndef 变量名
编写过一段Makefile文件后会发现,目标文件、依赖文件、编译命令之间存在一定的规律。比如目标文件一般依赖同名的.c文件,而生成这种目标文件使用gcc编译。为了简化Makefile文件的编写,make命令在实现时内嵌了隐含规则。
1、make命令在实现时内嵌了隐含规则,自动建立关于这个目标文件的依赖文件和编译所使用的命令。
隐含规则的基础是目标文件的拓展名! 比如:
program : header1.h header2.h
make会认为program是一个可执行文件,并根据隐含规则建立如下规则:
program : header1.h header2.h
gcc -o program program.c
编写makefile文件时通常会用到变量,makefile中定义变量的一般形式是:
变量名 赋值符 变量值
:
,#
,=
,空白符;=
,:=
,+=
,?=
;makefile中的变量类似于C语言中的宏,且变量区分大小写。有一些变量时系统预定义的,如自动变量:$@
,$?
,$<
,$*
等。
1、引用变量
变量引用方式:$(变量名)
或${变量名}
,如果变量名是单字符,可以直接使用$变量名
。$
在makefile中有特殊含义,$$
表示字符$
。
2、定义变量
makefile中两种类型变量:递归展开变量和立即展开变量。通过=
赋值的变量时递归展开变量,:=
赋值的是直接展开变量。
一个完整的Makefile文件由5部分构成:显式规则、隐含规则、使用变量、文件指示和注释。
1、显式规则
显式规则指明了目标文件、依赖文件、生成或更新目标文件所使用的命令。有些规则没有命令,这些规则只是描述了文件间的依赖关系。例如:
foo.o:foo.c defs.h
gcc -c -g foo.c
规则两个作用:
foo.o
,命令中没有明确指出defs.h
,foo.c
已经包含过头文件,这也是作为依赖文件出现的原因;一般形式:
目标文件列表 分隔符 依赖文件列表 [; 命令]
[命令]
[命令]
书写规则几个注意点:
(1)规则命令两种写法:命令和“目标文件、依赖文件”放在同一行,使用,
将命令和依赖文件分开;命令放在下一行作为独立命令行,以Tab
键开头,Makefile中所有以Tab
键开头的都作为命令行处理;
(2)Makefile中$
表示使用变量或函数,规则中需要$
的地方,书写两个连续的$$
;
(3)Makefile中较长的行,使用反斜线\
将其书写到独立的物理行上;
在Linux中,使用make来维护程序模块关系和生成可执行成需的工具,它可以根据程序模块的修改强狂重新编译链接生成中间代码或最终的可执行程序,执行make
命令,需要一个名为Makefile的文本文件,这个文件定义了整个项目的编译规则,包括模块间的依赖关系、文件的编译顺序、以及编译所使用的命令。通过make命令及Makefile文件,整个项目的源程序文件可以自动编译,极大的提高了软件开发效率。
make从Makefile文件获取模块间的依赖关系,判断哪些文件过时(文件生成后,源文件或头文件被修改了),然后使用Makefile中的编译命令进行编译。
例如:
main:main.o module1.o module2.o
gcc main.o module1.o module2.o -o main
main:main.c head1.h head2.h common_head.h
gcc -c main.c
module1.o:module1.c head1.h
gcc -c module1.c
module2.o:module2.h head2.h
gcc -c module2.h
#This is a makefile