make命令和makefile文件的结合提供了一个在项目管理领域十分强大的工具。
target ... : prerequisites ...
command
...
...
目标文件可以是中间目标文件,也可以是可执行文件,还可以是标签、伪目标。
command也就是make需要执行的命令(任意的shell命令)。
prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。
例如:编写文件Makefile1
myapp: main.o 2.o 3.o
gcc -o myapp main.o 2.o 3.o
main.o:main.c a.h
gcc -c main.c
2.o:2.c a.h b.h
gcc -c 2.c
3.o:3.c b.h c.h
gcc -c 3.c
它表示目标myapp依赖于main.o 2.o 3.o,而main.o依赖于main.c和a.h 等等。
$make -f Makefile1
/*-f 因为makefile文件并未使用常见的默认文件名makefile或者Makefile */
make: *** No rule to make target 'main.c',needed by 'main.o'. Stop.
解释:make命令假设在makefile文件中的第一个目标文件myapp 是想要创建的目标文件,然后它会检查其他的依赖关系,并确定需要一个main.c的文件。由于并未创建该文件,而且makefile文件中也并未说明如何创建,所以make命令报告一个错误。
$touch a.h
$touch b.h
$touch c.h
/*再次执行make命令*/
$make -f Makefile1
gcc -c main.c
gcc -c 2.c
gcc -c 3.c
gcc -o myapp main.o 2.o 3.o
/*生成可执行文件myapp ,我们运行以下这个程序*/
$./myapp
hello world
hello linux
make命令处理makefile 文件中定义的依赖关系,确定需要创建的文件以及创建顺序。虽然把如何创建目标myapp 列在最前面,但make命令能够自行判断出创建文件的正确顺序。他调用你在规则部分给出的command来创建相应的文件,同时会在执行时在屏幕上将命令显示出来。
现在我们来测试一下 在文件b.h改变时,makefile文件能否正确处理这一情况:
$touch b.h
$make -f Makefile1
gcc -c 2.c
gcc -c 3.c
gcc -o myapp main.o 2.o 3.o
make命令读取makefile文件,确定需要重建myapp所需的最少命令,并以正确的顺序执行它们。
$rm 2.o
$make -f Makefile1
gcc -c 2.c
gcc -o myapp main.o 2.o 3.o
makefile文件由一组依赖关系和规则构成。
target ... : prerequisites ...
command
...
...
目标文件可以是中间目标文件,也可以是可执行文件,还可以是标签、伪目标。
command也就是make需要执行的命令(任意的shell命令)。
prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。这就是Makefile的规则。也就是Makefile中最核心的内容。
例如:编写文件Makefile1
myapp: main.o 2.o 3.o
gcc -o myapp main.o 2.o 3.o
main.o:main.c a.h
gcc -c main.c
2.o:2.c a.h b.h
gcc -c 2.c
3.o:3.c b.h c.h
gcc -c 3.c
它表示目标myapp依赖于main.o 2.o 3.o,而main.o依赖于main.c和a.h 等等。
$make -f Makefile1
/*-f 因为makefile文件并未使用常见的默认文件名makefile或者Makefile */
make: *** No rule to make target 'main.c',needed by 'main.o'. Stop.
解释:make命令假设在makefile文件中的第一个目标文件myapp 是想要创建的目标文件,然后它会检查其他的依赖关系,并确定需要一个main.c的文件。由于并未创建该文件,而且makefile文件中也并未说明如何创建,所以make命令报告一个错误。
下面我们创建这些源文件,由于我们对程序的结果没有兴趣,所以文件的内容非常简单,头文件都为空。
$touch a.h
$touch b.h
$touch c.h
/*再次执行make命令*/
$make -f Makefile1
gcc -c main.c
gcc -c 2.c
gcc -c 3.c
gcc -o myapp main.o 2.o 3.o
/*生成可执行文件myapp ,我们运行以下这个程序*/
$./myapp
hello world
hello linux
make命令处理makefile 文件中定义的依赖关系,确定需要创建的文件以及创建顺序。虽然把如何创建目标myapp 列在最前面,但make命令能够自行判断出创建文件的正确顺序。他调用你在规则部分给出的command来创建相应的文件,同时会在执行时在屏幕上将命令显示出来。
现在我们来测试一下 在文件b.h改变时,makefile文件能否正确处理这一情况:
$touch b.h
$make -f Makefile1
gcc -c 2.c
gcc -c 3.c
gcc -o myapp main.o 2.o 3.o
make命令读取makefile文件,确定需要重建myapp所需的最少命令,并以正确的顺序执行它们。
$rm 2.o
$make -f Makefile1
gcc -c 2.c
gcc -o myapp main.o 2.o 3.o
make命令再次正确地确定出 需要采取的动作。