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
    评论
Makefile 是一个用于自动化编译和构建程序的工具。它可以帮助开发人员管理项目中的依赖关系和文件的编译顺序,从而提高项目的编译效率和可维护性。 学习 Makefile 可以带来以下好处: 1. 自动化编译:通过 Makefile,我们可以定义编译规则和依赖关系,使得程序的编译过程更加自动化。只需要运行 make 命令,Makefile 将会根据文件的修改时间判断哪些文件需要重新编译,从而加快程序的构建速度。 2. 管理依赖关系:Makefile 支持定义不同文件之间的依赖关系,当某个文件被修改时,只有它的依赖文件也被修改了,才需要重新编译。这种管理依赖关系的方式可以减少不必要的编译时间,提高编译效率。 3. 支持多平台:Makefile 是跨平台的,可以在不同操作系统上使用。这意味着我们可以使用相同的 Makefile 来在 Windows、Linux、macOS 等多个平台上进行程序构建,而不需要为每个平台编写不同的构建脚本。 4. 高度可定制:Makefile 的语法相对简单,但非常灵活,允许开发人员根据项目的需求自定义规则。我们可以通过定义变量、宏、规则和命令等来构建一个适合自己项目的 Makefile,满足特定的编译和构建需求。 5. 方便协作开发:在多人协作开发项目时,使用 Makefile 可以统一编译和构建的方式,避免因为不同开发环境导致的构建问题。每个开发人员只需要按照 Makefile 中定义的规则进行编译,从而保证整个项目的一致性和可靠性。 总的来说,学习 Makefile 可以帮助我们更好地管理项目的编译和构建,提高开发效率和项目的可维护性。掌握 Makefile 的基本语法和原理,能够更好地适应大型项目的开发和维护。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值