MakeFile学习

1、为什么需要Makefile文件

在linux系统中,一般通过make工具编译链接源文件,make是编译工具,为可执行程序,在/usr/bin目录下存放。Makefile文件来告诉编译器编译链接的规则,指导make完成编译工作。当执行make命令的时候就会解析当前所在目录下的Makefile文件。

2、makefile文件规则

1、规则
target… : prerequisites …
command(Tab作为开头)

target也就是一个目标文件,可以是Object File,也可以是执行文件,还可以是一个标签(Label)。prerequisites就是,要生成那个target所需要的文件或是目标。command也就是make需要执行的命令。(任意的Shell命令)

第一行定义了目标文件的依赖关系,后续第二行定义了生成目标文件的命令。make会比较targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets文件的日期要新,或者target不存在的话,那么,make就会执行后续定义的命令。

三个重要的变量:$@:目标文件,$^:所有的依赖文件,$<:第一个依赖文件。

2、make工作过程
(1)、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
(2)、为所有的目标文件创建依赖关系链,找到文件中的第一个目标文件(target)。
(3)、如果该目标文件不存在,或是目标的依赖文件修改时间要比目标文件新,就会执行后面所定义的命令来更新目标文件。
(4)、注意,当目标文件的依赖文件存在时,会先根据依赖关系链判断该依赖文件是否需要更新,依次递归。

通过上述分析,我们知道,像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。

3、make的自动推导
GNU的make很强大,它可以自动推导文件以及文件依赖关系后面的命令,只要make看到一个.o文件,它就会自动的把.c文件加在依赖关系中,因为,我们的make会自动识别,并自己推导命令,方式1为自动推导,方式2为正常依赖关系。

#方式1
httpconn.o: httpconn.h

#方式2
httpconn.o: httpconn.h
	gcc -c httpconn.c
#方式 3:将所有cpp文件编译成.o文件
.cpp.o:
        g++ -c $^ -o $@

4、文件搜寻
在一些大的工程中,有大量的源文件,我们通常的做法是把这许多的源文件分类,并存放在不同的目录中。所以,当make需要去找寻文件的依赖关系时,你可以在文件前加上路径,但最好的方法是把一个路径告诉make,让make在自动去找。
(1)、特殊变量“VPATH”
Makefile文件中的特殊变量“VPATH”就是完成这个功能的,如果没有指明这个变量,make只会在当前的目录中去找寻依赖文件和目标文件。如果定义了这个变量,那么,make就会在当当前目录找不到的情况下,到所指定的目录中去找寻文件了。

VPATH = src:…/headers


(2)、“vpath”关键字
另一个设置文件搜索路径的方法是使用make的“vpath”关键字(注意,它是全小写的),这不是变量,这是一个make的关键字,这和上面提到的那个VPATH变量很类似,但是它更为灵活。它可以指定不同的文件在不同的搜索目录中。

5、伪目标
“伪目标”并不是一个文件,只是一个标签,make无法生成它的依赖关系和决定它是否要执行。我们只有通过显示地指明这个“目标”才能让其生效。当然,“伪目标”的取名不能和文件名重名,不然其就失去了“伪目标”的意义了。
当然,为了避免和文件重名的这种情况,我们可以使用一个特殊的标记“.PHONY”来显示地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。

.PHONY: clean <-- 这句没有也行, 但是最好加上
clean:
-rm -f *.o


6、函数
(1)、patsubst,模式字符串替换函数
模式字符串替换函数: patsubst pattern,replacement,text
功能: 查找text中的单词(单词以"空格", "tab", "换行"来分割) 是否符合 pattern, 符合的话, 用 replacement替代。
返回: 替换过的字符串

object=$(patsubst %c,%o,*.c)






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值