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)
```
## 结果