makefile制作和逐步推进过程(一起学习吧)
优点 1开发效率 2编译速度
基本格式
target ... : prerequisites ...
command
...
...
- target 目标文件, 可以是 Object File, 也可以是可执行文件,$@
- 生成target所需要的文件或者目标依赖项, < <script type="math/tex" id="MathJax-Element-1">< </script>^
- make需要执行的命令 (任意的shell命令), Makefile中的命令必须以 [tab] 开头
- 隐晦规则,变量定义,文件指示 :: Makefile中引用其他Makefile 注释
通配符
- * :: 表示任意一个或多个字符
- ? :: 表示任意一个字符
- […] :: [abcd] 表示a,b,c,d中任意一个字符, [^abcd]表示除a,b,c,d以外的字符, [0-9]表示 0~9中任意一个数字
- ~ :: 表示用户的home目录
推演例子
#文件名需:makefile
all: a.out #首先依赖
a.out: main.o hello.o
gcc main.o hello.o
hello.o: hello.c
gcc -c hello.c
main.o: main.c
gcc -c main.c
变量使用
- allobj := main.o hello.o (:=和=的区别 :=是立即赋值 =要用时展开类define)
- 内置特殊变量:
- $@表示目标文件
- $<表示第一个依赖文件
- $*
- $%
- $^表示所有的依赖文件,
- $?
- $+
allobj := main.o hello.o
all: a.out
a.out: $(allobj)
gcc $^
hello.o: hello.c
gcc -c hello.c
main.o: main.c
gcc -c main.c
缺省规则
xxx.o自动依赖xxx.c 没有依赖.h不好使用
allobj := main.o hello.o
all: a.out
a.out: $(allobj)
gcc $^
makefile执行shell命令
target := hello.out
allobjc := $(shell ls *.c) #赋值所有.c文件
allobj := $(allobjc:.c=.o) #把.c文件修改.o文件
all: $(target)
$(target): $(allobj)
gcc -o $@ $^
头文件的依赖
gcc -MM 自动寻找.o文件依赖所有.h文件 gcc -MM a.c >a.d 文件内容 a.o:a.c xx.h xxx.h
target := hello.out
allobjc := $(shell ls *.c)
allobj := $(allobjc:.c=.o)
alldep := $(allobjc:.c=.d)
CC := gcc
all: $(target) #注意放的位置
# %为通配符
%.d: %.c
$(CC) -MM $< > $@
-include $(alldep)
# include main.d 文件内容
# main.o: main.c hello.h
# makefile会合并上下两句为 mian.o: main.c hello.h
# mian.o: main.c
%.o: %.c
$(CC) -c $<
$(target): $(allobj)
$(CC) -o $@ $^
使用make clean
一般放在文件最后
.POHONY clean:
-rm *.o *.d $(target)
方便使用的方法
makefile包含makefile
作用可把经常变动的变量个一个文件里,方便管理
-include define.mk #include相当于define拷贝过来,-当include的文件不存在忽略
测试makefile变量和命令
#测试输出变量
test:
echo $(allobj)
#命令本身会输出 可以加@不输出 echo 会输出两次所以加@
%.o: %.c
@echo "%.o:%.c"
$(CC) -c $<
其他
- 获取目录下的.c 和转换成.o的其他方法
comm_path = ./com
src := $(wildcard $(comm_path)/*.c)
obj := $(patsubst $(comm_path)/%.c,$(comm_path)/%.o,$(src))
- 多个目标 \分隔
target := a.out \ b.out
- 以后补
clearn:
-rm ... ...
distclean:
-rm ... ...
.PHONY:clean ALL distclean