make命令和makefile文件的就诶和提供了一个在项目管理领域十分强大的工具。它不仅被用于控制源代码的编译,而且还用于手册页的编写以及将应用程序安装到目标目录。
makefile的语法
makefile文件由一组依赖关系和规则组成。每个依赖关系由一个目标(即将要创建的文件)和一组该目标所依赖的源文件组成。而规则描述了如何通过这些依赖文件创建目标。一般来说,目标是一个单独的可执行文件。
make命令会读取makefile文件的内容,它显确定目标文件或要创建的文件,然后比较该目标所依赖的源文件的日期和时间以决定该采用哪条规则来构造目标。通常在创建最终的目标文件之前,它需要先创建一些中间目标。make命令会根据makefile文件来确定目标文件的创建顺序以及正确的规则调用顺序。
make命令的选项和参数
make程序有很多的选项,其中最常用的3个选项如下:
-k:作用是让make命令在发生错误的时候仍然继续执行,而不是在检测到一个错误的时候停下来。利用这个命令可以发现这个选项在一次操作中所有未编译成功的源文件。
-n:作用是让make命令输出将要执行的操作步骤,而不是真正的执行这些操作。
-f:它的作用是告诉make命令将哪个文件作为makefile文件。如果没有使用这个命令,标准版本的make命令会将首先在当前目录下查找名为makefile的文件,如果不存在,就会查找Makefile的文件。如果是在linux系统中,使用的可能是GNU Make这个版本中的make命令将在搜索makefile文件和Makefile之前,首先查找名为GNUmakefile的文件。一般情况下,都是使用Makefile。
1.依赖关系
依赖关系定义了最终程序里的每个文件和源文件之间的关系。
在makefile中,这些规则的写法是:先写目标的名称,然后紧跟一个冒号,接着是空格或者制表符,最后是用空格或者制表符隔开的文件列表。
下面的例子:
myapp: main.o 2.o 3.o
main.o: main.c a.h
2.o: 2.c a.h b.h
3.o: 3.c b.h c.h
它表示目标myapp依赖于mian.o, 2.o, 3.o,而main.o依赖于main.c和a.h。等等
如果想一次创建多个文件,你可以利用伪目标all。假设应用程序由二进制文件myapp和使用手册myapp.1组成。你可以用下面这行语句进行定义:
all: myapp myapp.1
这里再次强调,如果未指定一个all目标,则make命令将只创建它在文件makefile中找到的第一个目标。