(一)为何要编撰Makefile
我们自己平时在linux下编译源文件时linux基础教程,其实可以使用gcc-Wall-gmain.c-omain这样的命令一个一个编译,然而一个工程中的源文件不计其数,其按类型、功能、模块分别置于若干个目录中,我们一个个编译是非常耗费时间的,也是不可取的。
makefile带来的益处就是——“自动化编译”,一旦写好,只须要一个make命令,整个工程完全手动编译linux编译生成exe文件,极大的提升了软件开发的效率。
makefile定义了一系列的规则来指定,什么文件须要先编译,什么文件须要后编译,什么文件须要重新编译,甚至于进行更复杂的功能操作,由于makefile如同一个Shell脚本一样,其中也可以执行操作系统的命令。
(二)Makefile的基本规则
Mackfile基本规则
Target...:Dependencies...
Command...
说明:
1)目标(TARGET):即最终想要形成的文件,如:可执行文件,目标文件或中间文件等;目标也可以是要执行的动作,如clean,亦称为伪目标(用.PHONY指定伪目标)。
2)依赖(DEPENDENCIES):为了形成目标文件而依赖的文件列表,一个目标一般依赖于多个文件。
3)命令(COMMAND):是make执行的动作(shell命令或是可在shell下执行的程序,如echo)。注意:每位命令行的起始字符必须为TAB字符!
假如DEPENDENCIES中有一个或多个文件更新的话linux编译生成exe文件,COMMAND就要执行,这就是Makefile最核心的内容。
(三)简单Makefile的编撰
1.单级目录下的Makefile编撰
我们只须要使用viMakefile命令创建一个新的Makefile文件,等我们编撰好后,只须要使用make命令就可执行编译操作。这儿我们创建两个.c文件,使用她们生成目标文件:
[cpp]viewplaincopy
.PHONY:clean
OBJECTS=01.o02.o
main:$(OBJECTS)
gcc-Wall-g$^-o$@
01.o:01.c
gcc-Wall-g-c$02.o:02.c
gcc-Wall-g-c$clean:
rm-fmain$(OBJECTS)里面是相对简短的写法,我们一个个来解释:
1.使用变量来替代01.o02.o,便捷后文使用。
2.使用手动化变量简化一些操作
$@规则的目标文件名
lt;规则的第一个依赖文件名
$^规则的所有依赖文件列表
3.使用makeclean命令即可执行删掉操作
2.多级(二级)目录生成可执行文件的Makefile的编撰
0102文件夹下分别有01.c02.c,而且和文件夹同级目录的有03.clinux 内核,main是由这三个.c文件共同生成的,怎么编撰?
[cpp]viewplaincopy
.PHONY:cleanall
CC=gcc
CFLAGS=-Wall-g
BIN=main
SUBDIR=$(shellls-d*/)
ROOTSRC=$(wildcard*.c)
SUBSRC=$(shellfind$(SUBDIR)-name'*.c')
SUBOBJ=$(SUBSRC:%.c=%.o)
$(BIN):$(ROOTOBJ)$(SUBOBJ)
$(CC)$(CFLAGS)$(ROOTOBJ)$(SUBOBJ)-o$(BIN)
.c.o:
$(CC)$(CFLAGS)-c$clean:
rm-f*.o$(BIN)$(ROOTOBJ)$(SUBOBJ)1.SUBDIR=$(shellls-d*/)使用shell命令,将当前目录下所有的子目录赋给SUBDIR
2.ROOTSRC=$(wildcard*.c)ROOTSRC代表当前目录下符合匹配模式的所有文件
3.SUBOBJ=$(SUBSRC:%.c=%.o)生成.c对应的.o文件