一、Makefile是什么?
什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但是在linux系统中编译程序,makefile还是要懂,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
二、使用步骤
1.Makefile语法
目标...:依赖文件集合
命令1
命令2
......
例如一个工程有main.c a.c b.c三个文件,我们要把三个文件编译成可执行的main文件,我们可以这样写Makefile
main:main.o a.o b.o
gcc -o main main.o a.o b.o
main.o:mian.c
gcc -c main.c
a.o:a.c
gcc -c a.c
b.o:b.c
gcc -c b.c
clean:
rm *.o
rm main
注意:每条命令都必须以TAB键开始,不能使用空格!!!
上述代码中一共有 5 条规则, 1~2 行为第一条规则, 3~4 行为第二条规则, 5~6 行为第三条
规则, 7~8 行为第四条规则, 10~12 为第五条规则, make 命令在执行这个 Makefile 的时候其执
行步骤如下:
首先更新第一条规则中的 main,第一条规则的目标成为默认目标,只要默认目标更新了那
么就认为 Makefile 的工作,完成了整个 Makefile 就是为了完成这个工作。在第一次编译的时候
由于 main 还不存在,因此第一条规则会执行,第一条规则依赖于文件 main.o、 a.o 和 b.o
这个三个.o 文件,这三个.o 文件目前还都没有,因此必须先更新这三个文件。 make 会查找以这
三个.o 文件为目标的规则并执行。以 main.o 为例,发现更新 main.o 的是第二条规则,因此会执
行第二条规则,第二条规则里面的命令为“gcc –c main.c”, 这行命令很熟悉了吧,就是不链接
编译 main.c,生成 main.o,其它两个.o 文件同理。最后一个规则目标是 clean,它没有依赖文件,
因此会默认为依赖文件都是最新的,所以其对应的命令不会执行,当我们想要执行 clean 的话
可以直接使用命令“make clean”,执行以后就会删除当前目录下所有的.o 文件以及 main,因此
clean 的功能就是完成工程的清理.
2.Makefile变量
示例:
objects = main.o input.o calcu.o
main: $(objects)
gcc -o main $(objects)
=赋值符
作用:借助另外一个变量,可以将变量的真实值推到后面去定义。也就是变量的真实值取决于它所引用的变量的最后一次有效值。
:=赋值符
作用:赋值符“:=”不会使用后面定义的变量,只能使用前面已经定义好的
?=赋值符
作用:如果变量前面没有被赋值,那么此变量就是定义的变量,如果前面已经赋过值了,那么就使用前面赋的值。
变量追加“+=”
示例:
objects = main.o inpiut.o
objects += calcu.o
3.模式规则
模式规则中,至少在规则的目标定定义中要包涵“%”,否则就是一般规则,目标中的“%”
表示对文件名的匹配,“%”表示长度任意的非空字符串,比如“%.c”就是所有的以.c 结尾的文件,类似与通配符, a.%.c 就表示以 a.开头,以.c 结束的所有文件。当“%”出现在目标中的时候,目标中“%”所代表的值决定了依赖中的“%”值,使用方法如下:
%.o : %.c
命令
示例:
objects = main.o input.o calcu.o
main: $(objects)
gcc -o main $(objects)
%.o : %.c
gcc -c $<
clean:
rm *.o
rm main
4.自动化变量