文章目录
make 的语法既多又复杂,在此列出一些基本的规则
基本规则
Makefile 的基本规则如下:
目标(target):目标文件1 目标文件2
<tab> gcc -o 预建立的执行文件 目标文件1 目标文件2
注意:
命令行必须以Tab j键作为开头
- 在Makefile 中 # 代表注释
- 需要在命令行的(例如 gcc 这个编译器命令)的第一个字符
- 目标 (target) 与依赖文件(就是目标文件)之间需要用 :号隔开
如果想要执行两个或以上的文件链接操作时:
举例:假如有三个文件:main.c print.c print.h
三者关系如下:main.c(主程序)依赖—>print.c 依赖—>print.h
则相应的 Makefile 可以进行如下编写:
- 复杂一点的
test : main.o print.o
gcc -o test main.o print.o
mian.o : main.c print.h
gcc -c main.c
print.o : print.c print.h
gcc -c print.c
clean:
rm *.o
- 最简单的(让GNU自行推导三个文件的关系)
CC := gcc
objects := main.o print.o
test : &(objects)
$(CC) -o test $(objects)
&(objects) : print.h
main.o : main.c
print.o : print.c
clean:
rm *.o
如此一来,我们的 Makefile 里面就具有两个目标,分别是 test 和 clean ,如果我们想要建立 test 时,输入 【make test】;如果想要清除所有 .o 文件,输入【make clean】。而如果想要先清除目标文件再编译 main 这个程序时,输入【make clean test】
【注意】
Makefile 与 bash shell 脚本语法不太相同,变量的基本语法为:
- 变量与变量内容以 “=” 隔开,同时两边可以具有空格
- 变量的左边不可以有 【tab】键
- 变量与变量的内容在 “=” 两边不能具有 “:”
- 在习惯上,变量最好以【大写字母】为主
- 运用变量时,以 ${变量} 或 $(变量) 使用
- 在该 shell 的环境变量是可以被套用,例如提到的 CFLAGS 这个变量
- 在命令行模式也可以设置变量
由于 gcc 在进行编译的操作时,会主动获取 CFLAGS 这个环境变量,所以,可以直接在 shell 中定义出这个环境变量,也可以在 Makefile 文件里面去定义,更可以在命令行中设置这个东西,如:
[root@zhang ~]# CFLAGS="-Wall" make clean main
# 这个操作在使用 make 编译时,会读取 CFLAGS 的变量内容
也可以这样
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
CFLAGS = -Wall
main : $(OBJS)
gcc -o main $(OBJS) $(LIBS)
clean :
rm -f main &(OBJS)
其中,环境变量的使用规则是这样的:
-
make 命令行后面加上的环境变量为优先;
-
Makefile 里面指定的环境变量第二;
-
shell 原来具有的环境变量第三。
-
$@ :代表当前的目标(target)