Makefile的基本格式
#目标:依赖(条件)
# 命令
#all: add.c sub.c dive.c mul.c main.c
# gcc add.c sub.c div.c mul.c main.c -o app
app:add.o sub.o dive.o mul.o main.o
gcc add.o sub.o
add.o:add.c
gcc -c add.c gcc -c 只编译,不链接
sub.o:sub.c
gcc -c sub.o
dive.o:dive.c
gcc -c dive.c
Makefile 执行的两个阶段:
第一个阶段,自上向下建立关系树
第二个阶段, 自下向上执行命令
-------------------------------------------------
Makefile 项目管理工具
节省项目编译时间
只编译已经修改的文件
一次编写 终身受益
程序运行出错的返回值都会保存在$?里面,可以通过
echo $?来查看
1.调用make命令来调用Makefile文件,当敲make会自动到当前目录下找Makefile
2.在Makefile里面#代表注释
3. 所有命令前面必须有一个TAB空格键
4. 如果这个目标不依赖任何文件,则在定义目标之后,可以直接跟命令
clean:
rm *.o
rm app
5. make时候如果不带任何参数,则默认会执行第一个目标, 如果想执行clean目标,则需要手动指定clean目标:make clean (如果当前目录下已经存在clean文件,则不再执行clean命令)
解决办法:可以声明一个伪目标
.PHONY:clean
clean:
rm -f *.o
rm -f app
6. 如果想让Makefile 在执行命令出错的时候,不退出,则需要在命令前面加上’’-’’,如:
- rm add.o
所以完整写法为:
-rm -f *.o
-rm -f app
7. 如果不想看到Makefile输出的命令,可以在命令前面加上”@”符号
test:
@echo “hello”
8. Makefile中还可以定义变量,当要引用变量时候,可以$(变量名)来引用
obj=add.o sub.o mul.o dive.o main.o
app:$(obj)
gcc $(obj) -o app
9. Makefile有内建语法规则,make -P
$@表示目标, $^表示所有依赖, $<表示依赖中的第一个
#如果遇到后缀名为.o的文件,就依赖于同名的后缀名为.c的文件
%.o:%.c
gcc -c $< -o $@
#wildcard 可以打到当前目录下所有以.c结尾的文件名
src = $(wildcard *.c);
#patsubst 是一个字符串替换函数,意思就是说要把$(src)变量里面所有的以.c结尾的文件替换成.o结尾的文件(注意!只是文件名替换,没有生成.o文件);
obj = $(patsubst %.c,%.o,$(src));
target = app
$(target):$(obj)
gcc $^ -o $@
10. Makefile 常用变量(增加编译时的调试标志)
#预处理器标志(头文件)
CPPFLAGS= -Iinclude
# 编译的时候是否需要加调试信息
CFLAGS= -g -Wall
# 指定编译时的共享库
LDFLAGS= -L../lib -lmycalc
# 指定编译器
CC=gcc
$(CC) -c $< $(CFLAGS) $(CPPFLAGS) -o $@
11.
#彻底清除生成过程文件和生成配置文件
distclean:
install:
12 make -C 进入指定目录,调用里面的Makefile
make -C src
进入src这个目录,调用src目录里面的Makefile