简介:
makefile相当于一种脚本语言,在编写makefile过程中可以使用变量、控制结构语句、函数等一般编程语言的特性,而makefile诞生的本质是实现自动化编译,为程序员谋福利。makefile区别于其他语言最大特点是:其执行是由所编译文件的依赖关系驱动的。
makefile文件的组成内容
主要有以下五种组成部分:
1. 显示规则: 显示规则说明了生成一个或多个目标文件的方法和步骤,编写makefile文件时要包括生成的文件、生成文件的依赖文件以及生成的命令等
2. 隐式规则: make工具有自动推导功能,所以利用这个规则编写makefile文件时,可以简略的书写makefile
3. 文件指示:包括三部分,一部分是在一个makefile中引用另一个makefile(指令:make -f Makefile*);一部分是根据某些情况指定makefile中的有效部分;另一部分是定义一个多行的命令
4. 变量的定义:这些变量往往都是字符串,makefile被执行时,其中的变量会被展开到指定的引用位置上
5. 注释:‘#’字符
编写makefile规则
makefile文件的文件名最好命名为makefile或者Makefile,因为在默认情况下,make命令会在当前目录下按照顺序寻找这两个文件进行解释。
注意:make时要在当前目录下能够找到makefile或者Makefile文件
- 1.调用格式:
目标:依赖文件
【Tab键】命令
main:main.o add.o sub.o
gcc -g add.o sub.o main.o -o main
#目标main依靠依赖文件main.o add.o sub.o,
#而main.o依赖main.c,add.o依赖add.c,sub.o依赖sub.c
#所以想生成main,就必须调用下面三条指令生成依赖文件,在生成目标
main.o : main.c
gcc -c -g main.c -o main.o
add.o : add.c
gcc -c -g add.c -o add.o
sub.o : sub.c
gcc -c -g sub.c -o sub.o
make命令将执行该makefile文件中命令编译整个工程,默认make会执行makefile第一条规则,比如上述例子的目标就是可执行文件main,但是main依赖三个文件main.o,add.o,sub.o,如果依赖文件没有,将会去下面查找,所以上述例子会先去下面查找、生成三个依赖文件,再生成可执行文件main。
- 2.伪目标的创建:
伪目标不是真正的文件,所以make命令无法对其生成依赖文件,所以一定会去执行伪目标。
用标记.PHONY来显示的声明一个伪目标:
.PHONY:clean
...
clean:
[Tab键]rm -rf *.o
上述例子声明了一个伪目标clean,其作用是删除掉编译过程中产生的.o文件。
用法:
# make clean
效果:
[root@localhost project]# ls
add.c add.h main.c sub.c sub.h Makefile
[root@localhost project]# cat Makefile
.PHONY:clean
main:main.o add.o sub.o
gcc -g add.o sub.o main.o -o main
main.o : main.c
gcc -c -g main.c -o main.o
add.o : add.c
gcc -c -g add.c -o add.o
sub.o : sub.c
gcc -c -g sub.c -o sub.o
clean:
rm -rf *.o
[root@localhost project]# make
gcc -c -g main.c -o main.o
gcc -c -g add.c -o add.o
gcc -c -g sub.c -o sub.o
gcc -g add.o sub.o main.o -o main
[root@localhost project]# ls
add.c add.h add.o main main.c main.o sub.c sub.h sub.o Makefile
[root@localhost project]# make clean
rm -rf *.o
[root@localhost project]# ls
add.c add.h main main.c sub.c sub.h Makefile
- 3.使用变量:
makefile文件中的变量代表了一个字符串,类似于c语言中的宏
变量定义规则:
-变量一般大写
-变量名=值1 值2 …
-使用变量: $(变量名)
例如:
#定义变量OBJS
OBJS=main.o add.o sub.o
#使用变量
$(OBJS)
- 4.makefile文件书写的简化
$^ 代表所有依赖文件
$@ 代表目标文件
$< 第一个依赖文件
@指令 输出时不显示该指令
所以整个的makefile文件可简化为:
#简化前:
#main:main.o add.o sub.o
# gcc -g add.o sub.o main.o -o main
#main.o : main.c
# gcc -c -g main.c -o main.o
#add.o : add.c
# gcc -c -g add.c -o add.o
#sub.o : sub.c
# gcc -c -g sub.c -o sub.o
##################################################
#简化后:
.PHONY:clean main
CC=gcc
OBJS=main.o add.o sub.o
main: $(OBJS)
$(CC) -g $^ -o $@
clean:
rm -rf $(OBJS)
- 5.其他注意事项:
1.命令前加@符号,会不显示出命令内容
2.echo命令,可以把变量内容读出来
3.使用其他makefile文件,命令: make -f 其他makefile文件