Makefile
命名:makefile / Makefile
一个规则
| hello:hello.c |
| gcc hello.c -o hello |
若想生成目标,检查规则中的依赖条件是否存在,如不存在,则寻找是否有规则用来生成该依赖文件。
检查规则中的目标是否需要更新,必须先检查它的所有依赖项,依赖中有任一个被更新,则目标必须更新。
makefile默认第一组规则的目标为终极目标。手动指定:
| ALL:a.out |
| |
| a.out:hello.o add.o sub.o div.o |
| gcc hello.o add.o sub.o div.o -o a.out |
| |
| add.o:add.c |
| gcc -c add.c -o add.o |
| sub.o:sub.c |
| gcc -c sub.c -o sub.o |
| hello.o:hello.c |
| gcc -c hello.c -o hello.o |
| div.o:div.c |
| gcc -c div.c -o div.o |
两个函数
| src = $(wildcard ./*.c) |
| 匹配当前工作目录下所有的.c文件,将文件名组成列表,赋值给变量src。 |
| obj = $(patsubst %.c, %.o, %(src)) |
| 将参数3中,包含参数1的部分,替换为参数2。 |
| clean: |
| -rm -rf $(obj) a.out |
| |
| -rm中'-'的作用是删除不存在的文件时,不报错,依次执行。 |
| make clean -n |
| 不实际执行,把命令打出来 |
| make clean |
| 执行 |
| src = $(wildcard *.c) |
| obj = $(patsubst %.c, %.o $(src)) |
| |
| ALL:a.out |
| |
| a.out: $(obj) |
| gcc $(obj) -o a.out |
| add.o:add.c |
| gcc -c add.c -o add.o |
| sub.o:sub.c |
| gcc -c sub.c -o sub.o |
| hello.o:hello.c |
| gcc -c hello.c -o hello.o |
| div.o:div.c |
| gcc -c div.c -o div.o |
| |
| clean: |
| -rm -rf $(obj) a.out |
三个自动变量
| $@:在规则的命令中表示目标 |
| $^:在规则的命令中表示所有依赖条件 |
| $<:在规则的命令中,表示第一个依赖条件,如果将该变量应用在模式规则中,可将依赖条件列表中的依赖项依次取出,套用模式规则。 |
| src = $(wildcard *.c) |
| obj = $(patsubst %.c, %.o $(src)) |
| |
| ALL:a.out |
| |
| a.out: $(obj) |
| gcc $^ -o $@ |
| add.o:add.c |
| gcc -c $< -o $@ |
| sub.o:sub.c |
| gcc -c $< -o $@ |
| hello.o:hello.c |
| gcc -c $< -o $@ |
| div.o:div.c |
| gcc -c $< -o $@ |
| |
| clean: |
| -rm -rf $(obj) a.out |
模式规则
| src = $(wildcard *.c) |
| obj = $(patsubst %.c, %.o $(src)) |
| |
| ALL:a.out |
| |
| a.out: $(obj) |
| gcc $^ -o $@ |
| |
| %.o:%.c |
| gcc -c %< -o $@ |
| |
| clean: |
| -rm -rf $(obj) a.out |
a.out依赖的.o匹配到模式规则,使用模式规则生成。
静态模式规则
| $(obj):%.o:%.c |
| gcc -c $< -o %@ |
伪目标
如果路径下有名为clean或ALL的文件,make clean
不生效。需要make文件后追加伪目标。
| myArgs = -Wall -g |
| |
| a.out: $(obj) |
| gcc $^ -o $@ $(myArgs) |
例子
| // src/hello.c mul.c sub.c add.c div.c |
| // inc/head.h |
| // obj/*.o |
| gcc -c ./src/add.c -o ./obj/add.o -I ./inc |
| src = $(wildcard ./src/*.c) |
| obj = $(patsubst ./src/%.c, ./obj/%.o, $(src)) |
| inc_path = ./inc |
| myArgs = -Wall -g |
| |
| ALL:a.out |
| |
| a.out: $(obj) |
| gcc $^ -o $@ $(myArgs) |
| $(obj):./obj/%.o:./src/%.c |
| gcc -c $< -o $@ $(myArgs) -I $(inc_path) |
| |
| clean: |
| -rm -rf $(obj) a.out |
| |
| .PHONY: clean ALL |
参数
| -n: 模拟执行make、make clean命令 |
| -f: 指定文件执行make命令 |
| |
| make -n |
| make clean -n |
| make -f filename |
| make -f filename clean |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!