本文共 1660 字,大约阅读时间需要 5 分钟。
.....
今天我们来了解一下一个强大的工具Makefile。它可以自动帮我们自动处理代码。
我们来看看度娘的解释:
一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为Makefile就像一个Shell脚本一样,也可以执行操作系统的命令。Makefile的伟大之处在于,编译多个源文件或者管理编译依赖关系的复杂性,就不再是 अगरOUCH那样的苦工苦修了。我们只需写一个简单的Makefile文件,在需要的时候用【make】这个命令就能完成编译任务。
具体操作步骤一目了然:
vim Makefile
# 编译生成mybin可执行文件mybin: Test.c gcc Test.c -o mybin# 清理已编译的目标文件clean: rm -rf mybin
make
编译完成后,可以在当前目录中找到名为mybin的可执行文件。再次执行make命令时,文件如下:
执行生成脚本文件时,会优先检查源文件的更新时间。如果没有发生任何改动,Make会跳过编译步骤直接输出“目标已建立”。
make clean
接下来,我们来分析这个简单的Makefile结构。
依赖关系
第一个规则定义了mybin可执行文件的依赖关系:它由Test.c源文件编译而来。可以推断出,Test.c经过编译生成了mybin文件。依赖方法
第二个规则定义了具体的编译命令。Make会依据第一个规则,使用第二个规则来生成目标文件。前提条件是Trist.c存在,我们用Tab键启动一个新的命令行,编写编译指令:gcc Test.c -o mybin
这样Make就知道,每当Test.c发生改变时,需要重新生成mybin文件。
文件时间机制
Make内部会比较源文件和目标文件的最后更新时间。只有目标文件的更新时间晚于源文件时才执行重新编译。这意味着:示例验证:
修改Test.c代码后发现make=axx之前生成的mybin时间早于Test.c时间?运行:
stat Test.c mybin
观察输出结果,检查文件的Access、Modify、Change时间是否符合预期。如果出现Test.c的时间优先,表示需要重新编译。
.PHONY伪目标
所谓的.PHONY目标,是Make的一种特殊目标。通常用于强制执行操作,即使目标文件不存在。例如:PHONY: @echo "清理已编译文件..." rm -rf mybin
这样不管是否存在mybin,执行clean命令时总是会进行文件清理操作。
其它Makefile特性
在Makefile中可以使用变量:CC = gccEXE = mybin$(EXE): $(SOURCES) $(CC) -o $@ $(SOURCES)
这样提高脚本的可读性和可维护性。
支持特殊组合符号:
$^
:表示上一行的内容$@
:表示目标文件请根据需求合理组合这些变量。
至此,你已经掌握了Makefile的基础知识及其在项目管理中的实际应用。通过合理设计Makefile文件,你可以实现自动化编译、依赖管理以及文件版本控制等多种功能。如果对Makefile还有其他需求,可以进一步深入探索其强大功能。
转载地址:http://ckzfk.baihongyu.com/