makefile,顾名思义,它的作用是来生成文件的。makefile可以对源代码进行管理,可以完成编译,链接,执行等阶段。当编写完成后,在终端执行make命令就可以执行makefile文件中的行为,一键完成编译,链接,执行等操作。非常的方便。makefile有自己的文件规则,它可以定义和使用变量,他也有自己的赋值语句,可以使用函数,可以执行shell命令,makefile是向下依赖的,也就是说,写在最后的最先执行,然后一级一级往上执行。Windows下的好多编译器都帮我们写好了makefile,不用开发人员自己写,但是如果你想做一个合格的程序员,想完成大型项目,你就需要了解makefile,本文的代码是在ubuntu下编写的。
makefile的规则(请注意底下那段话)
target ... : prerequisites ...
command
...
...
target也就是一个目标文件,可以是Object File,也可以是执行文件。还可以是一个标签(Label)。
prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。(任意的Shell命令)
下面我们来看一个makefile文件:
SRC = main.cpp
CC = g++
test:test.o
./test.o
test.o:$(SRC)
$(CC) $(SRC) -o test.o
clean:
rm -rf *.o test.o
上面就是一个makefile的例子。
第1,2行,先定义两个变量SRC和CC,并分别给他们赋值。
第4行,test是一个标签。这个标签依赖test.o,当这个标签被调用,就执行test.o
第5行,./test.o是shell的命令,表示执行test.o这个可执行文件。在./test.o之前是一个制表符,在makefile中,写命令时要在命令之前写个制表符。
第7行,在第4行,test标签依赖一个test.o,test.o从哪来呢,所以在这一行,就指明了test.o的生成需要哪些文件,这里写了个$(SRC),是什么意思呢,SRC是我们在第一行定义的变量,这里引用了这个变量,$(SRC)就被替换成main.cpp,所以test.o生成需要main.cpp。makefile的变量有点像C语言中的宏。
第8行,在第7行,写了test.o的生成需要main.cpp,但是main.cpp又怎么生成test.o呢,所以在这一行,就由main.cpp生成test.o。行的开头以制表符开头,说明本行也是执行命令的,该行展开后是这样子的:g++ main.cpp -o test.o 该命令是调用g++编译器,将main.cpp生成test.o
第9行,定义一个名为clean的标签没有依赖文件。
第10行,写了clean标签被调用的时候,执行的shell命令。该命令的作用是清除Makefile所在的目录下的所有后缀为.o的文件。
我们在终端上执行:
make test
make命令就会找当前目录下的makefile文件,并调用test标签,完成编译,链接,执行的操作。
如果执行:
make clean
make就会执行clean标签,清除Makefile所在的目录下的所有后缀为.o的文件。