Makefile学习笔记1
1、基本语法与变量
1.1 基本的makefile规则是这样的:
目标(target):目标文件1 目标文件2 <tab> gcc -o 要建立的执行文件 目标文件1 目标文件2
那个目标(target)就是我们想要建立的信息,而目标文件就是所有具有相关性的目标文件。那建立执行文件的语法就是<tab>按键开头的那一行。特别注意:命令行必须要以Tab键作为开头。它的规则基本上是这样的:
- 在makefile 中的#代表注释;
- <tab>需要在命令行(例如gcc这个编译器命令)的第一个字符;
- 目标(target)与依赖文件之间需要用:隔开。
如果想要执行一个命令就可以清除掉所有的目标文件和执行文件,可以这样制作:
#1.先编辑makefile建立新的规则,此规则的名称叫做clean main:main.o haha.o sin_value.o cos_value.o gcc -o main main.o haha.o sin_value.o cos_value.o -lm clean: rm -f main main.o haha.o sin_value.o cos_value.o #以新的目标(clean)测试看看执行make的结果: [root@study ~]# make clean rm -f main main.o haha.o sin_value.o cos_value.o
如此一来,如果我们想要建立main的话,输入【make main】;如果想要清除掉所有的文件,输入【make clean】;如果想要先清除所有文件,再建立main的话,输入【make clean main】。
1.2 用变量来简化makefile
LIBS = -lm OBJS = main.o haha.o sin_value.o cos_value.o main:${OBJS } gcc -o main ${OBJS } ${LIBS} clean: rm -f main ${OBJS }
makefile 语法与bash shell脚本的语法有点区别,变量的基本语法:
- 变量与变量内容以【=】隔开,同时两边可以有空格;
- 变量左边不可以有<tab>;
- 变量与变量内容在【=】两边不能有【:】;
- 在习惯上,变量最好以大写字母为主;
- 运行变量时,以${变量}或$(变量)使用;
- 在该shell的环境变量是可以被套用的,例如提到的CFLAGS这个变量;
- 在命令行模式也可以设置变量。
由于gcc在进行编译的时候,会主动读取CFLAGS这个环境变量,所以,你可以直接在shell中定义出这个环境变量,也可以在makefile文件中去定义,更可以在命令行中设定这个环境变量:
[root@study ~]# CFLAGS="-Wall" make clean main #这个操作在使用make进行编译时,会去读取CFLAGS的变量内容
也可以是:
[root@study ~]#vim makefile
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):
[root@study ~]#vim makefile LIBS = -lm OBJS = main.o haha.o sin_value.o cos_value.o CFLAGS = -Wall main:${OBJS } gcc -o $@ ${OBJS } ${LIBS} clean: rm -f main ${OBJS }