makefile基本语法


1.makefile的引入

main.c为主体,input.c负责接收从键盘输入的数值,calcu.h进行任意两个数相加
main.c

input.c

input.h

calcu.c

calcu.h

这里面当代码特别多的时候
gcc main.c input.c calcu.c -o main
这行代码就比较长
有一种办法是分别把main,input, calcu编译成点o文件,然后再gcc连接
gcc -c main.c
gcc -c input.c
gcc -c calcu.c
gcc main.o input.o calcu.o - o main
这样以后只要我修改了calcu.c, 只需要gcc -c calcu.c,然后再链接,节省了时间
但是这样编译的代码量增大了,所以采用了makefile

2.Makefile

3.makefile基本语法

基本语法

目标:依赖集合
命令1
命令2
(命令列表中每条命令必须以TAB键开始, 不能用空格)
默认的第一个目标就是终极目标

makefile变量的使用

# 变量使用
objects = main.o input.o calcu.o
main: $(objects)
	gcc -o main $(objects)


不加@就会把所执行的命令打印出来的
注意此时输出的是shaozheming,=号的值取决于name的值,加上:=就不会这个问题
?=:如果前面赋值了就用前面的值, 没有赋值就用?=后面的值
+=:类似字符串拼接

makefile模式规则

类似通配符的规则
%.o : %.c

自动化变量

上面的通配符规则虽然大大减少了代码量,但是在
gcc -c main.c 这里面的main不能换成%
常用的几种:
$@ : 规则中的目标集合,如果有多个目标,表示匹配模式中定义的目标集合
$< : 依赖文件集合的第一个文件,如果依赖文件是以%定义的,那么这个就是符合模式的一系列文件集合
$^ : 所有依赖文件集合,使用空格分开。如果在依赖文件中有多个重复文件,他会去除重复文件,只保留一份

伪目标

伪目标是为了避免Makefile中定义的只执行命令的目标和工作目录下的市级文件出现名字冲突,比如clean,这个就是只执行下面的命令而不是生成文件,因此工作目录下永远不会存在文件clean,所以属于make clean,这个命令一定执行。但当我们手贱在工程目录下创建一个clean文件,规则因为没有依赖文件,所以这个clean文件是最新的,那后面的rm命令也不会执行。为避免这个问题,可以将clean声明为伪目标。声明方式为:
.PHONY : clean