初学用make进行项目管理

Make是Linux下的项目管理工具,其作用就是自动进行程序的编译和链接,从而生成指定的目标程序。其工作时的执行步骤如下,
(1)读入所有的Makefile
(2)读入被include的其他Makefile(后面有解释)
(3)初始化文件中的变量
(4)推到隐式规则,然后分析所有规则
(5)为所有目标创建依赖关系链
(6)根据依赖关系,决定生成那些目标
(7)执行命令

其规则格式一般为
目标文件 : 依赖文件
    执行命令(生成目标文件,本行必须以Tab键开头)
其中目标文件可以是编译文件,执行文件,还可以是一个标签(相见后面的伪目标)
依赖文件是指生成目标文件所需要的文件,目标文件或者标签。
执行命令就是所需执行的命令。
上面的规则确定了一个依赖关系。如果依赖文件中的任何一个文件比目标文件要新的话,就会执行的所设置的命令。如

main : main.c
    gcc main.c -o main  #如果命令很长,可以使用'/'作为换行符。

上面的规则就是如果源文件main.c要比执行文件main新的话,就会执行命令gcc main.c -o main。当然这只是一个简单的例子,make的功能要比这强大的多。
在Makefile中,规则的顺序是很重要的,因为,Makefile会把第一个出现的目标作为最终目标,

make的使用依靠的是程序员编写的Makefile文件,这个文件包含了一个工程编译所需遵循的所有规则。这个文件一般包含了五部分内容:
1:显式规则
书写者显式指出的规则,如上面的例子。

2:隐式规则
make具有自动推导功能,提供了一些默认的规则,如目标文件是main.o,它会自动将文件main.c当作依赖文件,而相应的命令也会设为gcc -c main.c main.o

3:变量定义
Makefile中的变量定义,更像是C语言中的宏定义。当执行时,变量总是在引用位置上展开。Makefile中的变量定义分为两种,一种是,另一种 是。

4:文件指示
包括三个部分,分别是文件包含,制定有效部分,定义多行命令。这三部分也和C中的某些内容相似,如文件包含---include,制定有效部分 ---#ifdef。
文件包含使用关键字include,语法为
include 文件名称
其中文件名称可以包括路径和通配符。在include前面可以有空字符,但不能以Tab键开始(make以Tab开头当作命令的开头)。文件名称可以包含 多个文件。如include a.mk b.mk c.mk,也可以使用通配符include *.mk来代替。在规则中可以使用的通配符有'*',’[]',其中'*'代表任意长度的字符串,'[]'则是代表所有与括号内字符相同的字符。
如果使用通配符的命令,make将会在当前目录下搜索所有文件名以.mk结尾的文件,并包含到本文件的当前位置。当然,也可以指定搜索目录:
(1)如果make执行时,有-I或者--include-dir参数,那么make会在指定的目录中进行搜索。如 make -I/home/you,则会在目录/home/you下搜索指定文件。
(2)赋值给Makefile文件的特殊变量VPATH后,则make会在所指定的目录中去寻找文件,不同的目录用':'号隔开。如文件中包含内容 VPATH = src:include,这条语句指定了两个目录,src和include,make会在当前目录找不到指定文件时,到目录src和include中搜 索。
(3)使用make的vpath关键字也可以设置文件搜索路径。其使用方法有三种:1、vpath <pattern> <directory>为符合模式<pattern>的文件指定搜索目录<directory>,如vpath %.h /home/you表示在目录/home/you中搜索所有文件名以.h结尾的文件。vpaht语句可以连续使用 2、vpath <pattern>清楚符合模式<pattern>的文件的搜索目录。3、vpath清楚所有设置了的文件搜索目录。

如果指定文件没有找到,则make会继续载入其他文件内容,并且生成一条警告信息。等到文件读取完成,make会再次重试载入指定文件,如果还是不行,则 make才终止。当然,如果使用命令-include 文件名称,则make不会理会未读取的文件而继续执行。有时环境变量MAKEFILES的使用也能达到include的作用,只是这样引入的目标不会有作 用。

5:注释
Makefile中的注释以#开头,而且注释只能是行注释。当然,如果文件中需要使用字符‘#’,可以使用转义字符/。

在Makefile中,目标文件还可以是伪目标。如
clean:
    rm *.o
伪目标只是一个标签,并不是个真是的文件。这些目标只能通过显式的指明才能生成。上面的例子,只能调用make clean,结果就是删除所有文件名以.o结尾的文件。为了避免和某个文件重名(如当前项目要生成的程序名称为clean,此时就会有冲突),因此,一般 伪目标都使用.PHONY来显式的指明,如上例可以写为
.PHONY:clean
clean:
    rm *.o
当然,也可以为伪目标指定依赖文件。由于伪目标并不会生成具体的文件,所以如果当前工程包含多个程序,则可以把伪目标作为最终目标。如某个项目中需要生成 三个程序,program1,program2,program3,则可以如下书写Makefile文件。
.PHONY:all
all:program1 program2 program3

program1:program.o
    gcc -o program1 program.o

program2:program.o
    gcc -o program2 program.o

program3:program.o
    gcc -o program3 program.o
同样,伪目标同样也可以成为依赖文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值