背景
- 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
- 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作
- makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编 译,极大的提高了软件开发的效率。
- make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一 种在工程方面的编译方法。
- make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建
一.make/Makefile
make是一个命令,Makefile是一个文件,当前目录下的文件
make命令执行时,需要一个 Makefile 文件,以告诉make命令需要怎么样的去编译和链接程序。
1.1.Makefile的书写规则
Makefile文件包含了一系列的“规则”,每个规则的基本结构如下:
目标(target)…: 依赖(prerequisites)…
<tab>命令(command)
- 目标(target):通常是要生成的文件的名称,也可以是执行的动作名称,如“clean”。
- 依赖(prerequisites):生成目标所需要的文件或中间过程生成的目标。
- 命令(command):通过执行命令对依赖操作生成目标。命令前必须是一个Tab字符,不能是空格。
例子(有些东西如 $@ 、$^、.PHONY后面都会讲.):
test:test.cc
g++ -o $@ $^
.PHONY:clean
clean:
rm -f test
这个文件的意思就是使用make命令的时候就会执行g++ -o test test.cc的命令,使用make clean时则会执行rm -f test这个命令。
1.2.Makefile的文件名
默认的情况下,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件,找到了解释这个文件。在这三个文件名中,最好使用“Makefile”这个文件名,因为,这个文件名第一个字符为大写,这样有一种显目的感觉。最好不要用“GNUmakefile”,这个文件是GNU的make识别的。有另外一些make只对全小写的“makefile”文件名敏感,但是基本上来说,大多数的make都支持“makefile”和“Makefile”这两种默认文件名。
当然,你可以使用别的文件名来书写Makefile,比如:“Make.Linux”,“Make.Solaris”,“Make.AIX”等,如果要指定特定的Makefile,你可以使用make的“-f”和“--file”参数,如:make -f Make.Linux或make --file Make.AIX。
1.3.make/Makefile的一个使用案例
首先,我们用一个示例来说明make/Makefile是怎么使用的。
我们在里面写下
第一行的意思就是mycode.c编译成名字叫mycode的可执行程序,这个叫依赖关系
第二行是怎么编译,这个是依赖方法
完成了以后,我们再也不用使用gcc命令来编译了
直接生成了一个可执行程序
后面我们不想要可执行程序mycode了,我们直接打开Makefile