本文通过编写一个,将目录下任意.c文件生成其无.后缀的可执行文件(例如hello.c生成hello的可执行文件)的makefie文件。引入各个知识点逐步改良编写的makefile,在这个过程中完全理解makefile基础。
最终makefile文件代码展示(可先跳过,逐步理解后,最后再看一遍)
target = $(patsubst %.c,%,$(wildcard *.c))
ALL:$(target)
%:%.c
gcc $< -o $@
.PHONY:clean
clean:
rm -rf $(target)
1.规则
目标:依赖条件
(一个tab缩进)命令
1.目标的时间必须晚于依赖条件的时间,否则,更新目录
2.依赖条件如果不存在,找寻新的规则去产生依赖
第一版makefile文件:
通过当前知识与gcc编译相关基础知识,就可以编写指定当前待编译文件和生成文件的简单 makefile文件了
例:创建一个文件名为makefile的文件,往文件中添加下述内容
hello:hello.c
gcc hello.c -o hello
使用make命令即可完成makefile文件的执行,执行结果如下图所示

2.ALL
ALL:指定最终生成的终极目标
不用ALL去指定最终需要生成的目标文件时,makefile默认会以目标的第一个文件为标准。当生成这个文件后,及时后续还有想要生成的目标文件,也不会继续执行,makefile会直接退出。
第二版makefile(防止漏生成目标文件):
ALL:hello
hello:hello.c
gcc hello.c -o hello
函数
1.wildcard
简述:找到当前目录下所有通配符匹配的文件
例:找到当前目录下所有后缀为.c的文件,赋值给src
src = $(wildcard *.c)
2.patsubst
简述:带模式的字符串替换,将参数3中,包含参数1的部分替换为参数2
例:把src变量里所有后缀为.c的文件替换成.o
obj = $(patsubst %.c,%.o,$(stc))
变量
$@:在规则的命令中,表示规则的目标
$^:在规则的命令中,表示规则的所有依赖条件
$<:在规则的命令中,表示规则的第一个依赖条件。如果将该变量应用在模式规则中,它可将依赖条件列表中的依赖依次取出,套用模式规则(模式规则后续介绍)。
第三版makefile(当前目录下只有一个文件时,可以不需要知道文件名称进行编译):
src=$(wildcard *.c)
target=$(patsubst %.c,%,$(src))
ALL:$(target)
target:src
gcc $< -o $@
模式规则
简述:和规则匹配目标的目标文件和依赖文件会依次执行后续的命令。
%:%.c
gcc -c $< -o %@
第四版makefile(目录下任意.c文件生成其无.后缀的可执行文件)
target = $(patsubst %.c,%,$(wildcard *.c))
ALL:$(target)
%:%.c
gcc $< -o $@
拓展:静态模式规则
简述:指定变量来匹配这个模式规则,只有当前变量中包含的内容才进行匹配该模式规则
$(obj):%:%.c
gcc -c $< -o %@
clean:
简述:清除编译生成的中间文件和最终目标文件
clean:
rm -rf $(obj)
第五版makefile(可以清除生成的中间文件和目标文件)
target = $(patsubst %.c,%,$(wildcard *.c))
ALL:$(target)
%:%.c
gcc $< -o $@
clean:
rm -rf $(target)
伪目标
简述:能够确定执行makefile clean命令,防止当前目录下有clean文件名的文件,导致make clean 命令无法正常执行
.PHONY:clean
最终版makefile(增加伪目标,防止makefile clean 无法执行清除命令)
target = $(patsubst %.c,%,$(wildcard *.c))
ALL:$(target)
%:%.c
gcc $< -o $@
.PHONY:clean
clean:
rm -rf $(target)
本文详细介绍了如何编写一个makefile文件,用于自动化地将目录下的C源文件编译成无后缀的可执行文件。通过逐步改良makefile,读者可以理解makefile的基础规则,包括目标、依赖、命令、wildcard函数、patsubst函数以及静态模式规则。最后,文章还展示了如何添加清理目标以删除编译生成的文件。
&spm=1001.2101.3001.5002&articleId=129798341&d=1&t=3&u=367cf8280fa54aa0b1b2bb88552b0677)
688

被折叠的 条评论
为什么被折叠?



