makefile简单介绍

由于才刚接触Makefile不久,这里只能做出一些简单的介绍。

通常,我们建立一个工程,里面存放许多源文件,这时候,就有一些问题产生了。到底哪些文件先编译,哪些需要重编译,哪些根本就不需要编译(假设存在不需要编译的文件,当然,通常在一个工程中是不会出现这种状况的),甚至一些更加复杂的操作,而我们的Makefile就规定了一系列的规则来使这些操作准确无误地进行。其实我们也可以把Makefile看做是一个Shell脚本,虽然它们还是有所区别的。

我们可以来看一下Shell脚本和Makefile的区别。

1)Makefile

一个makefile由依赖关系和规则两部分内容组成。

A.依赖关系

依赖关系由一个目标和一组该目标所依赖的源文件组成。这里所说的目标就是将要创建或更新的文件,最常见的是可执行文件。

B.规则(规则用来说明怎样使用所依赖得文件来建立目标文件)

target(目标文件或可执行文件) : prerequisities(依赖文件列表,罗列生成target所需的文件或者目标)

command(执行指令,Shell命令)···

这样的规则可以减少重编译,为什么呢?假如我们存在如下的:TestA.c, TestB.c, TestC.c, TestA.h, TestB.h, TestC.h, main.c。

Makefile中为 

test : main.o TestA.o TestB.o TestC.o
g++ -o test main.o TestA.o TestB.o TestC.o
TestB.o : TestB.c TestB.h
g++ -c TestB.c
TestA.o : TestA.c TestA.h
g++ -c TestA.c
TestC.o : TestC.c TestC.h
g++ -c TestC.c 
main.o : main.c TestA.h TestB.h TestC.h
g++ -c main.c


则当我们make该文件时,输出:

g++ -c main.c

g++ -c TestA.c

g++ -c TestB.c

g++ -c TestC.c 

g++ -o test main.o TestA.o TestB.o TestC.o

执行该文件时输出:

Test  A

Test  B

Test  C

若此时我们改变文件TestA.c中的内容,让其输出Test D,重新make之后输出:

g++ -c TestA.c

g++ -o test main.o TestA.o TestB.o TestC.o

执行该文件时输出:

Test  D

Test  B

Test  C

这说明了只有当prerequisities比target“新”的时候才执行command,减少了重编译次数。

2)Shell脚本

大家都使用过批处理文件吧?从某种程度上说,Shell脚本就是批处理文件。脚本文件是一个可执行文本文件,用户在Shell提示符下所有输入内容都可以放到脚本文件内使用,也就是说,原本在Shell下需要输入的多行命令可以放到Shell脚本文件中,通过使用一个命令完成所有的工作。

3)区别

A.在Makefile中只能在target下调用Shell脚本和执行Shell命令,而其他地方则不行,但在Shell脚本中,任何地方都可以调用Shell脚本和执行Shell命令

B.在Makefile中一行代码是通过创建一个进程来执行。

C.在Shell脚本中,变量是通过在变量名前加一个$来表示,而在Makefile中,在变量名前加一个$代表Makefile变量,加两个$才代表Shell变量。

其实还有一些通配符或者其他的小区别,在这里就不介绍了。总之,Makefile写得好的话,make命令和Makefile配合使用,能给我们的项目管理带来极大的便利,除了用于管理源代码的编译之外,还用于建立手册页,同时还能将应用程序安装到指定的目录。

Makefile 是一个用于自动化编译构建项目的工具,通过定义目标(target)、依赖(dependencies)命令(commands),实现诸多功能,如自动化构建、依赖管理、跨平台支持以及复杂任务管理等。它能仅重新编译修改过的文件,提升效率,确保目标文件按正确顺序生成,还可通过条件语句适应不同操作系统,支持清理、测试、安装等操作[^4]。 在项目中,当有成百上千的源程序文件时,编译链接这些源文件是有规则的,Makefile 就可以确定整个工程的编译规则,只需一个 make 命令,就能实现“自动化编译”。make 是一个解释 makefile 中指令的命令工具,大多数的 IDE 都有这个命令,像 Delphi 的 make、Visual C++ 的 nmakeLinux 下 GNU 的 make 等[^1]。 在语法方面,其基本规则格式为“目标: 依赖1 依赖2 ...”,后面跟着以 Tab 键开头的命令。目标是要生成的文件(如 main.o)或伪目标(如 clean);依赖是生成目标所需的文件或其他目标;命令则表示如何生成目标。在 Makefile 中的命令,必须要以 [Tab] 键开始。 Makefile 的文件名有一定规定,默认情况下,make 命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件,找到后解释这个文件。在这三个文件名中,建议使用“Makefile”,因其第一个字符为大写,较为醒目。也可以使用别的文件名来书写 Makefile,如“Make.Linux”“Make.Solaris”“Make.AIX”等,若要指定特定的 Makefile,可以使用 make 的“-f”“--file”参数,如“make -f Make.Linux”或“make --file Make.AIX”。此外,在 Makefile 中使用 include 关键字可以把别的 Makefile 包含进来,这很像 C 语言的 #include,被包含的文件会原模原样地放在当前文件的包含位置,include 的语法是固定的 [^2]。 虽然当前在实际工作中几乎都不会手写 makefile 文件,但必须学习它,因为当前的现代 C/C++ 工程管理工具本质都是通过自动化的方式生成,其原理也都归结于 makefile [^3]。 以下是一个简单Makefile 示例: ```makefile CC = gcc CFLAGS = -Wall -g target: source.c $(CC) $(CFLAGS) source.c -o target clean: rm -f target ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值