《GUN Make项目管理》--第一章如何编写一个简单的makefile

make程序可让“将源代码转换成可执行文件”之类的例行工作自动化。相较于脚本,make的优点是:你可以把程序中各元素之间的关系告诉make,然后make会根据这些关系和时间戳判断应该重新进行哪些步骤,以产生你所需要的程序。

备注:unix文件具有三种时间属性:atime(最近被读取的时间) ,ctime(模式被改变的时间)以及mtime(最近被写入的时间)。上面的时间戳指的就是mtime.

make一般会将工作细节存放在一个名为makefile的文件中。下面是一个可用来编译“hello world”程序的makefile:

hello: hello.c
    gcc hello.c -o hello

要编译次程序,只需要在命令行输入

$make

make程序就会读入makefile,并且编译它在该处所找到的第一个工作目标:

$make
gcc hello.c -o hello

工作目标与必要条件

make所看到的第一项规则会被作为默认规则(default rule)使用。一项规则可分成三部分:1,工作目标(target)2,它的必要条件(prerequisite)3,以及所要执行的命令(command)

target: prereq1 prereq2
    commands

工作目标(target)是一个必须建造的文件或进行的事情;

必要条件或依存对象是工作目标得以被成功创建之前,必须事先存在的那些文件;

所要执行的命令则是必要条件成立时会将创建工作目标的那些shell命令。

foo.o: foo.c foo.h
    gcc -c foo.c

工作目标foo.o出现在冒号之前;必要条件foo.c, foo.h出现在冒号之后;命令脚本通常出现后续的文本行上,并且一定是在tab按键之后。

检查依存关系

count_words: count_words.o lexer.o -lfl

【一个知识点】这里有一个 -lfl 参数。指的是-l 选项,用法 -l<Name>。

当-l<Name>形式的必要条件被发现时,make会搜索libName.so形式的文件,如果找不到相符的文件,make接着会搜索libName.a形式的文件。

猜你喜欢

转载自blog.csdn.net/yush34/article/details/89527803