》 学会编写Makefile文件是完成大型项目的基础,一个大型工程里的源文件不计其数,按类型,功能,模块分别放在若干个目录中,makefile定义了一系列规则指定那些文件需要先编译,哪些需要后编译等等.....甚至于更复杂的功能操作。makefile就像一个shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是--------“自动化编译”,一旦写好这个文件,只需要一个make命令,整个工程完全自动编译,极大地提高了软件开发的效率。
》 make是一个命令工具,是一个解释makefile文件中指令的命令工具。它可以在必要时重新编译所有受影响的源文件。
》 makefile文件的语法
$ makefile文件由一组依赖关系和规则构成。每个依赖关系由一个目标(即将要创建的文件)和一组该目标所依赖的源文件组成。而规则描述了如何通过这些依赖文件创建目标。一般来说,目标是一个单独的可执行文件。
$ make命令会读取makefile文件的内容,它先确定要创建的目标文件,然后比较该目标所依赖的源文件到日期和时间,以决定该采用哪条规则来构造目标。通常在创建最终的目标文件之前,需要先创建一些中间目标。make命令会根据makefile文件来确定目标文件的创建顺序以及正确的规则调用顺序。
》make命令的选项和参数
make命令本身有许多选项,其中最常用的三个选项是:
- -k:它的作用是让make命令在发现错误时仍然继续执行,而不是在检测到第一个错误时就停下来。我们利用这个选项在一次操作中发现为编译成功的源文件。
- -n:它的作用是让make命令输出将要执行的操作步骤,而不真正执行这些操作。
- -f filename:它的作用是告诉make命令将哪个文件作为makefile文件。如果未使用这个选项,make命令将首先查找当前目录下名为makefile的文件,如果该文件不存在,就会查找名为Makefile的文件。
<span style="font-size:18px;"> mymain:main.o
main.o:main.c main.h
</span>
如上,mymain文件生成依赖main.o, main.o文件生成依赖main.c和main.h。<span style="font-size:18px;">all:myapp myapp.1</span>
如果make未找到制定目标all则只创建makefile文件里的第一个目标。<span style="font-size:18px;">mymain:main.o
gcc -o mymain main.o
main.o:main.c main.h
gcc -c main.c </span>
也许有些同学理解不了gcc后面的参数,那么这里说一下文件的生成方式:例如有一个test.c文件,那么它运行的过程是什么呢?<span style="font-size:18px;">mymain:main.c
gcc -o mymain main.c
:PHONY:clean</span>
<span style="font-size:18px;"> clean:
rm -f mymain
</span>
上面这种写法mymain直接依赖main.c,生成一个伪目标,移除目标文件。