makefile还有一些系统的函数,在此就不一一列举l了。今天学习学习伪目标和隐含规则。
1.伪目标
在第一讲中的例子中有如下代码:
clean:
rm edit main.o kbd.o
这里“clean”就是一个伪目标。
我们在编译的过程中生成了许多编译文件,那么也应该提供一个清除它们的“目标”以备完整的重新编译而用。(例如:make clean实现文件的清除)。
因为我们并不生成“clean”这个文件,所以称其为“伪目标”。
- “伪目标”并不是一个文件,只是一个标签,由于“伪目标”不是文件,所以make无法生成它的依赖关系和决定它是否要执行。所以我们只有通过显示的指明这个“目标”才能让其生效。
- “伪目标”的取名不能和文件名重名,否则就失去了“伪目标”的意义了。
为了避免和文件重名,我们可以使用一个特殊的标记,“.PHONY”来显示地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。例如:
.PHONY:clean
只要有这个声明,不管是否有“clean”文件,要运行“clean”这个目标,只有“make clean”。于是整个过程可以这样写:
.PHONY:clean
clean:
rm *.o temp
-
伪目标一般没有依赖文件。但是我们也可以为伪目标指定所依赖的文件。伪目标同样可以作为“默认目标”
方法:只要将其放在第一个。
例如:需要makefile一次生成若干个可执行文件,但是只想简单的一次make完事,并且所有的目标文件都写在一个makefile中,就可以使用“伪目标”这个特性。
all:prog1 prog2 prog3
.PHONY:all
prog1:prog1.o utils.o
cc -o prog1 prog1.o utils.o
prog2:prog2.o
cc -o prog2 prog2.o
prog3:prog3.o sort.o utils.o
cc -o prog3 prog3.o sort.o utils.o
一些约定俗成的伪目标:(当然也可以重新命名而不使用这些名称)
-
all:这个伪目标是所有目标的目标,其功能一般是编译所有的目标
-
clean:这个伪目标的功能是删除所有被make创建的文件
-
install:这个伪目标的功能是安装已经编译好的程序,其实就是把目标执行文件copy到指定目标中去
-
print:这个伪目标的功能是列出改变过的源文件
-
tar:这个伪目标的功能是把源程序打包备份,也就是一个tar文件
-
dist:这个伪目标的功能是创建一个压缩文件,一般是把tar文件压成z文件或者gz文件
-
TAGS:这个伪目标的功能是更新所有的目标,以备完整的重新编译使用
-
check和test这个伪目标一般用来测试makefie的流程
2.隐含规则
“隐含规则”也就是早先约定了的,不需要我们写出来的规则,它是一种惯例。例如,把[.c]文件编译成[.o]文件这个规则,就可以不用写出来,make会自动推导出这种规则,并生成我们需要的[.o]文件。
例如:
foo:foo.o bar.o
cc -o foo foo.o bar.o $(CFLAGS) $(LDFLAGS)
以上的代码中并没有写下如何生成foo.o bar.o这两个目标的规则和命令
- CFLAGS:C语言编译器的参数。
- LDFLAGS:链接器参数
注:
- 如果我们 [.o]文件书写了自己的规则,那么make就不会自动推导并调用隐含规则了。
-
在make的“隐含规则库”中,每一条隐含规则都在库中有其顺序,越靠前的则是越被经常使用的,所以,这会导致我们有些时候即使我们显示地指定了目标依赖,make也不会管。
例如这条规则(没有命令):
:
foo.o:foo.p
依赖文件“foo.p”有可能变得没有意义。
如果目录下存在
了“foo.c”文件,那么我们的隐含规则一样会生效,并会通过“foo.c”调用C的编译器生成foo.o文件。
因为,在隐含规则中,Pascal的规
则出现在C的规则之后,所以,make找到可以生成foo.o的C的规则就不再寻找下一条规则了。
所以如果确实不希望任何隐含规则推导,则需要明确写出命令。
就写到这啦,下次继续,因为这个我理解的还很浅显啦!
分享到:
相关推荐
《跟我一起写makefile》和《gnumakefile》是两本关于makefile的重要学习资料,它们涵盖了构建自动化工具make的使用、配置以及优化等多个方面。makefile是软件开发中的核心部分,它允许开发者通过简洁的规则定义来...
这个压缩包“Makefile学习参考资料.zip”包含了两份PDF文档,分别是“跟我一起学Makefile.pdf”和“gun_make.pdf”,很可能是关于Makefile的基础教程和GNU Make的官方文档。 在Makefile中,最重要的概念是目标...
以下详细阐述了make以及makefile的学习要点: 1. Makefile概述 Makefile是一个脚本文件,其中包含了编译和链接项目所需的各种规则。它描述了项目中哪些文件需要先编译,哪些文件需要后编译,哪些文件依赖于其他文件...
《Makefile学习手册》是一本专门针对Makefile开发的详细指南,旨在帮助读者从基础到深入地理解并掌握这一强大的构建工具。Makefile是软件工程中用于自动化编译和链接过程的重要文件,尤其在Unix/Linux环境中广泛使用...
学习Makefile不仅是掌握其语法,更重要的是理解其背后的编译和链接机制。通过合理组织Makefile,可以高效地管理和自动化复杂的构建过程。对于程序员来说,了解Makefile是走向专业化的必经之路。特别是当涉及到跨平台...
《makefile学习三件套 电子书》是一个针对makefile技术的综合学习资源,它包含了三个核心部分:《gnu make》、《GNU make中文手册》和《跟我一起写Makefile》。这些文档旨在帮助读者深入理解和掌握makefile的编写与...
### Make工具及makefile规则学习 #### 一、Make工具的功能 Make工具是一种自动化构建工具,主要用于管理和构建大型软件项目。其主要功能包括: - **避免不必要的重复编译**:通过检查文件的时间戳来确定哪些文件...
Makefile学习资料.rarMakefile学习资料.rarMakefile学习资料.rarMakefile学习资料.rarMakefile学习资料.rarMakefile学习资料.rarMakefile学习资料.rarMakefile学习资料.rarMakefile学习资料.rarMakefile学习资料....
* 学习曲线陡峭:Makefile 的语法非常复杂,需要花费一些时间来学习和掌握。 * 不好 debug:Makefile 的错误信息不够明确, debug 相对困难。 Makefile 是一个功能强大且灵活的自动化编译工具,在软件开发过程中...
Makefile学习笔记 Makefile是一个编译系统自动构建工具,它可以根据源文件的变化自动编译和链接对象文件,并生成执行文件。Makefile文件包含了一系列的规则和命令,这些规则和命令描述了如何从源文件生成目标文件。...
Makefile学习教程: 跟我一起写 Makefile 0 Makefile概述 0.1 关于程序的编译和链接 1 Makefile 介绍 1.1 Makefile的规则 1.2 一个示例 1.3 make是如何工作的 1.4 makefile中使用变量 1.5 让make自动推导 ...
make中文手册等 小测试: # Readme: # use: make config # use: make dir # use: make # use: make clean # use: make rebuild # use: make cleanall # use: make test # use: make
压缩包中的三份PDF文件分别对应以上三本书的内容,它们构成了一个完整的makefile学习资源库。首先,你可以通过《跟我一起写makefile》快速入门,了解makefile的基本构造和使用。然后,深入研究GNU Make Manual,掌握...
标题中提到的“Makefile教程”是指关于Makefile的学习资料,而“Makefile快速学习资料”说明本资料是为快速掌握Makefile编写的入门级教程。Makefile是Unix系统中的一个工具程序,主要用于软件开发中的自动化编译。它...
通过学习和理解`makefile`,程序员不仅可以更好地组织和管理代码,还能提升大型项目的构建效率,这对于成为一名专业的Linux C程序员来说是必不可少的技能。因此,深入学习`makefile`的编写规则和实践是每个Linux C...
这个`makefile学习用测试文件.rar`很显然是为了帮助初学者理解和掌握`Makefile`的基本概念和用法。在本文中,我们将深入探讨`Makefile`的主要组成部分,以及如何编写和使用它来编译和管理项目。 `Makefile`的核心...
总结来说,这个“makefile示例程序”是一个很好的学习资源,通过它你可以掌握如何编写和使用Makefile来自动化构建项目,提高开发效率。在实际工作中,无论是小型的个人项目还是大型的团队协作,Makefile都是一个不可...