0x06_make基础

Makefile

命名:makefile / Makefile

一个规则

目标:依赖条件
(一个tab)命令
hello:hello.c
gcc hello.c -o hello

若想生成目标,检查规则中的依赖条件是否存在,如不存在,则寻找是否有规则用来生成该依赖文件。

检查规则中的目标是否需要更新,必须先检查它的所有依赖项,依赖中有任一个被更新,则目标必须更新。

makefile默认第一组规则的目标为终极目标。手动指定:

ALL:a.out
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) # add.c sub.c div.c hello.c
obj = $(patsubst %.c, %.o $(src)) # add.o sub.o div.o hello.o
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文件后追加伪目标。

.PHONY: clean ALL
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: 模拟执行makemake clean命令
-f: 指定文件执行make命令
make -n
make clean -n
make -f filename
make -f filename clean
posted @   Pannnn  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
-->
点击右上角即可分享
微信分享提示