Makefile基础知识和使用

本文详细介绍了Makefile的基础知识,包括基本命令、伪指令、变量使用和规则定义。通过实例展示了如何编译源文件,清理目标文件,以及利用通配符和特殊符号简化规则。此外,还提到了Makefile中的函数如patsubst和wildcard的使用,并给出了关于编译选项和库文件管理的建议。文章旨在帮助读者掌握Makefile的编写技巧,提高自动化构建效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Makefile基础知识

(注,只是基础的验证部分未验证,语法功能差不多,自己修改相关的语法即可)

第一级 (基本命令)

1、命令:
目标:源
	[TAB]执行命令
#例子
main:main.o
	gcc main.o -o main
main.o:main.S
	gcc main.S -o main.0
main.S:main.i
	gcc -S main.i -o main.S
main.i:main.c
	gcc -E main.c -o main.i
	
.PHONY
clean:
	rm *.o
cleanall:
	rm *.o rm*.i rm*.s rm main
	
2、伪指令
.PHONY
clean:
​	xxxx

第二级 (升级)

变量=(替换),+=(追加),:=(常量)
使用变量:$(变量名) 替换
#例子
TAR = main
OBJS = main.o test.o person.o
CC = tcc
$(TAR):$(OBJS)
	$(CC) $(OBJS) -o $(TAR)

main.o:main.c
	$(CC) -c main.c -o main.o

test.o:test.c
	$(CC) -c test.c -o test.o
	
person.o:person.c
	$(CC) -c person.c -o person.o
	
.PHONY
clean:
	rm *.o
	
cleanall:
	rm $(OBJS)

第三级(规则使用)

隐含规则 :%.c, %.o 表示任意的.c和.o文件, *.c *.o 表示所有的.c .o文件

#例子
TAR = main
OBJS = main.o test.o person.o
CC = tcc
$(TAR):$(OBJS)
	$(CC) $(OBJS) -o $(TAR)

%.o:%.c
	$(CC) -c %.c -o %.o
	
.PHONY
clean:
	rm *.o
	
cleanall:
	rm $(OBJS)

第四级 (通配符使用)

​ $^ 表示所有的依赖文件

​ $@ 表示所有的目标文件

​ $< 表示所有的依赖文件的第一个文件名称

​ $* 表示 不包含扩展名的目标文件名称

​ $+ 表示 所有依赖文件,以空格分开,并以出现的先后为序,可能有重复的依赖文件

​ $? 表示所有时间戳比目标文件晚的依赖文件,并以空格区分开

#例子
TAR = main
OBJS = main.o test.o person.o
CC := gcc
$(TAR):$(OBJS)
	$(CC) $^ -o $@

%.o:%.c
	$(CC) -c $^ -o $@
	
.PHONY
clean:
	rm *.o
	
cleanall:
	rm $(OBJS)

Makefile 函数说明

patsubst 函数说明:patsubst函数用于将文件模式进行替换

# 例如 
obj = $(patsubst "%.cpp", "%.o", ${src})
说明:他的功能就是把后缀名为.c 文件的名字变成 .o 为后缀的名字

wildcard函数说明:wildcard 函数就是将遍历目录下的文件

# 例如:
src=$(wildcard *.c)
# 当前路径下找到.c文件,并将它们全都赋给src变量。

​变量名使用习惯:CFLAGS 、CXXFLAGS、CPPFLAGS、LDFLAGS 、LIBS

  • CFLAGS 表示用于C编译器的选项 如:CFLAGS=-I/usr/include -I/opt/local/include
  • CXXFLAGS 表示用于C++/g++编译器的选项 如:CXXFLAGS=-I/usr/include -I/opt/local/include
  • CPPFLAGS 表示用于C++/g++编译器的选项 如:CPPFLAGS=-I/usr/include -I/opt/local/include
  • LDFLAGS:gcc 等编译器会用到的一些优化參数,也能够在里面指定库文件的位置 如:LDFLAGS=-L/usr/lib
  • LIBS:指定编译链接哪些库文件,如LIBS = -lpthread

使用规则如下:

当前代码路径如下:在这里插入图片描述### 例子:

target=main
src = $(wildcard ./src/*.cpp)
obj = $(patsubst ./src/%.cpp, ./build/%.o, $(src))
LIBS=-lpthread
CXXFLAGS=-I include
CXX:=g++​
ALL:$(target)
​$(obj):./build/%.o:./src/%.cpp
     $(CXX) -c $< -o $@ $(CXXFLAGS)​
$(target):$(obj)
    $(CXX) $(obj) -o $(target) $(LIBS)​
.PHONY:clean
clean:
    rm $(obj) $(target) 
​```

## 结果![在这里插入图片描述](https://img-blog.csdnimg.cn/80743d5b27224d018c9d25a5e0fe19ca.png#pic_center)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值