链接: 自动构建之CMake
Makefile
Makefile是用于自动化构建软件项目的工具,Makefile的优点是简单、直接,可以直接使用make工具进行构建。但是,Makefile通常需要手动编写和维护,可能会导致跨平台和跨编译器的兼容性问题。
Makefile文件
all:
@echo "hello all"
test:
@echo "hello test"
make默认执行第一个任务,也就是all
也可以指定执行,例如make test
Makefile通常包含以下几个部分:
- 变量:用于存储文件名、编译器选项等信息。
- 规则:定义了如何从源文件生成目标文件,包括编译、链接等操作。
- 依赖关系:指定目标文件依赖于哪些源文件,以确保在源文件发生更改时重新构建目标文件。
- 命令:实际执行的编译、链接等操作。
依赖
all:test
@echo "hello all"
test:
@echo "hello test"
上述文件中,all就依赖于test,会先执行test,再执行all
多文件形式
Makefile内容
.PHONY: main clean
simple: main.o foo.o
gcc -o simple main.o foo.o
main.o: main.c
gcc -o main.o -c main.c
foo.o: foo.c
gcc -o foo.o -c foo.c
clean:
rm simple main.o foo.o
其中.PHONY是做伪目标作用
可以看到,simple:依赖于main.o foo.o;其中main.o依赖于main.c文件,foo.o依赖于foo.c文件(这两个依赖可以不用写,但是simple的依赖必须写,因为simple的任务执行前必须要先执行生成main.o和foo.o)
makefile文件执行的时候会检查目标任务结果是否有更新,如果代码没有更新的话,那么make是会不会重复再执行任务。
变量
.PHONY: clean
CC = gcc
RM = rm
EXE = simple
OBJS = main.o foo.o
$(EXE): $(OBJS)
$(CC) -o $(EXE) $(OBJS)
main.o: main.c
$(CC) -o main.o -c main.c
foo.o: foo.c
$(CC) -o foo.o -c foo.c
clean:
$(RM) $(EXE) $(OBJS)
自动变量
$@
$^
$<
可以看到其中
$@所指的是其中命令被运行的目标任务名称
$^则表示的是规则中的所有依赖条件。
$<表示的是规则中的第一个依赖条件。
通配符
采用变量加通配符等,可以实现自适应编译的操作。
假如文件分布
Makefile内容
.PHONY: clean
CC = gcc
RM = rm
EXE = simple
#SRCS = main.c foo.c
SRCS = $(wildcard *.c) #wildcard 是通配符函数,可以找到所有的.c文件
#SRCS = foo.c foo2.c main.c
OBJS = $(patsubst %.c,%.o,$(SRCS))#patsubst 是字符串替换函数,把.c换成对应的.o
#OBJS = foo.o foo2.o main.o
$(EXE): $(OBJS)
$(CC) -o $@ $^
%.o: %.c #% 也是匹配符
$(CC) -o $@ -c $^
clean:
$(RM) $(EXE) $(OBJS)
src: # 测试make src显示相应的xx.c
@echo $(SRCS)
objs:# 测试make objs显示相应的xx.o
@echo $(OBJS)
其中%是匹配符https://blog.csdn.net/BobYuan888/article/details/88640923
make执行结果:
此时假如我增加一个foo3函数,可以不更新Makefile文件,仍然可以编译成功