简单的Makefile万能模板

很少用到makefile,给我的感觉总是晦涩难懂,所以记录一下Makefile的学习过程,日后再慢慢补充

目录

  • 简单模板举例
  • 简单万能模板:

语法规则

目标文件:依赖文件
命令1
命令2

简单模板举例

main: main.o a.o b.o
	gcc -o main main.o a.o b.o
main.o:main.c
	gcc -c main.c
a.o:a.c
	gcc -c a.c
b.o:b.c
	gcc -c b.c
.PHONY:clean
clean:
	rm *.o
	rm main

注意:
1.每一行的只能用TAB键缩进,不能用空格键开头,否则会make出错。
2.第一个目标文件会作为最终的目标文件。
3.gcc命令使需加上-c ,用来保证得到的.o文件可重链接。简单来说,最后生成的可执行文件就是链接.o文件得到的,即使没有gcc -o main main.o a.o b.o这行命令,也会生成main文件。
4. .PHONY的作用是声明clean为伪目标。即无论是否有clean文件,都要执行后面的rm命令。
如果没加.PHONY,当文件夹中没有clean文件的时候,输入make clean能够正常执行,但是当文件夹中有clean文件时,再输入make clean时,由于这个规则没有任何依赖文件,所以目标被认为是最新的,所以不会去执行rm命令。

make执行顺序:
1、make在当前目录下找到Makefile或makefile文件。
2、如果找到,它会找文件中的第一个目标文件,在上面的例子中,他会找到“main”这个文件,并把这个文件作为最终的目标文件。
3、如果main文件不存在,或是main所依赖的后面的 .o 文件的文件修改时间要比main这个文件新,那么,它就会执行后面所定义的命令来生成main这个文件。
4、如果main所依赖的.o文件也不存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。

规范化写法:
在开发较大工程时,会有很多文件,按照上面例子的写法太繁琐了,所以使用符号和变量会使Makefile更简洁
$^ 代表所有的依赖文件
$@ 代表所有的目标文件
$< 代表第一个依赖文件
$(变量名) 表示使用该变量

简单万能模板:


OBJS = main.o\    # "\"是转义字符,“#"是注释字符
		a.o\
		b.o\
main: $(OBJS)
	gcc -o main $^   #这里这一行省略的话就生成不了main文件,但是上面例子可以,目前还不知道原因
%.o:%.c
	gcc -c $^ -o $@
.PHONY:clean
clean:
	rm $(OBJS)
	rm main #这里有个疑问,当前面要删除的文件不存在时,后面的删除命令也不会继续执行
	

你可能感兴趣的:(Linux,makefile)