Makefile简单理解及介绍 1.makefile的基础概念makefile常常和make命令搭配使用属于make命令的配置文件当我们调用make命令时make会在当前目录下找名字叫“Makefile”或“makefile”的文件在makefile中定义了系列的规则来指定哪些文件需要先编译哪些⽂件需要后编译哪些⽂件需要重新编译甚至是更复杂的操作。一般来说makefile里包含以下三个内容。目标需要生成的文件依赖生成目标所需要的文件命令所执行的指令其中需要注意的是命令开头必须以tab键开头格式如下目标依赖命令示例myproc:myproc.o gcc myproc.o -o myproc myproc.o:myproc.s gcc -c myproc.s -o myproc.o myproc.s:myproc.i gcc -S myproc.i -o myproc.s myproc.i:myproc.c gcc -E myproc.c -o myproc.i .PHONY:clean clean: rm -f *.i *.s *.o myproc上述代码可帮助你将myproc.c生成一个myproc文件。2.makefile的工作原理1.make会在当前目录下找名字叫“Makefile”或“makefile”的文件。2.如果找到它会找⽂件中的第⼀个⽬标⽂件target在上面的例子中它会找到myproc这个⽂件并把这个⽂件作为最终的⽬标⽂件。3.如果myproc⽂件不存在或是myproc所依赖的后⾯的myproc.o⽂件的⽂件修改时间要⽐myproc这个⽂件新那么他就会执⾏后面所定义的命令来⽣成myproc 这个⽂件。4.如果myproc所依赖的myproc.o⽂件不存在那么make会在当前⽂件中找⽬标为myproc.o⽂件的依赖性如果找到则再根据那⼀个规则⽣成myproc.o ⽂件。5.这就是整个make的依赖性make会⼀层⼜⼀层地去找⽂件的依赖关系直到最终编译出第⼀个⽬标⽂件。3.makefile里变量CC gcc这里用CC替换了gcc定义变量使用等于号。BINmyproc.exe CCgcc SRC$(wildcard *.c) OBJ$(SRC:.c.o) RMrm -f $(BIN):$(OBJ) $(CC) -o $ $^使用变量时需要用$(),如这里的$(CC)相当于gcc。需要注意的是在makefile里有几个便捷的变量符号$:代表目标文件如上面的BIN。$^:代表依赖文件如上面的OBJ。$:代表第一个依赖文件。4.伪目标常常使用.PHONY修饰伪目标的特性是总是被执行的。BINmyproc.exe 2 CCgcc 3 SRC$(wildcard *.c) 4 OBJ$(SRC:.c.o) 5 RMrm -f 6 $(BIN):$(OBJ) 7 $(CC) -o $ $^ 8 %.o:%.c 9 $(CC) -c $ 10 .PHONY:clean 11 clean: 12 $(RM) $(OBJ) $(BIN)在这里clean命令被.PHONY修饰属于伪目标这就会让make忽略源⽂件和可执⾏⽬标⽂件的M时间对比总是可以执行这条命令不是伪目标就需要比较源文件和可执行文件的modify时间的先后如源文件的modify时间比可执行文件的modify时间早则编译的操作不会被执行反之会编译一个新的可执行文件。5.适当拓宽语法BINproc.exe # 定义变量 CCgcc #SRC$(shell ls *.c) # 采⽤shell命令⾏⽅式获取当前所有.c⽂件名 SRC$(wildcard *.c) # 或者使⽤ wildcard 函数获取当前所有.c⽂件名 OBJ$(SRC:.c.o) # 将SRC的所有同名.c 替换 成为.o 形成⽬标⽂件列表 LFLAGS-o # 链接选项 FLAGS-c # 编译选项 RMrm -f $(BIN):$(OBJ) $(CC) $(LFLAGS) $ $^ # $:代表⽬标⽂件名。 $^: 代表依赖⽂件列表 echo linking ... $^ to $ %.o:%.c # %.c 展开当前⽬录下所有的.c。 %.o: 同时展开同名.o $(CC) $(FLAGS) $ # %: 对展开的依赖.c⽂件⼀个⼀个的交给gcc。 echo compling ... $ to $ # 不回显命令 .PHONY:clean clean: $(RM) $(OBJ) $(BIN) # $(RM): 替换⽤变量内容替换它其中%.o是展开当前目录的所有.o文件%.c是展开当前目录的.c文件在命令前加上让在执行make时命令不回显。shell,wildcard可以帮助我们批量获得想要的文件名字。