- makefile规则
target(目标): (tab) dependent conditions(依赖)
commend ...
- 一个简单的makefile
/* 方式1: */
target: main.cpp one.cpp two.cpp
g++ main.cpp one.cpp two.cpp
/* 方式2: */
target: main.o one.o two.o
g++ main.o one.o two.o
main.o: main.cpp
g++ -std=c++11 -c main.cpp
one.o: one.cpp
g++ -c one.cpp
two.o: two.cpp
g++ -c two.cpp
方式2将目标拆分为多个子目标,当修改某一模块时,编译器只重新编译修改过的文件,节约编译时间
- makefile中的变量
obj=main.o one.o two.o
target=app
${target}:${obj}
g++ $^ -o $@
# g++ ${obj} -o ${target}
%.o:%.cpp
g++ -c $< -o $@
# makefile中的自动变量
# $<: 规则中的第一个依赖
# $@: 规则中的目标
# $^: 规则中所有的依赖
# 只能在规则的命令中使用
- makefile系统维护变量
# makefile自己维护的变量都为大写
# CC: 编译器类型 默认cc
# CPPFLAGS: 预处理需要的选项 -I
# CFLAGS: 编译时使用的参数 -Wall -g -c
# LDFLAGS: 链接库使用的选项 -L -l
# 例
obj=main.o one.o two.o
target=app
CC=g++
${target}:${obj}
${CC} $^ -o $@
%.o:%.cpp
${CC} -c $< -o $@
- makefile函数
# wildcard 查找目录下所有.*文件, $ 取值
src=$(wildcard ./*.cpp)
# patsubst 匹配替换, 将变量str中所有.cpp替换为.o
obj=$(patsubst ./%.cpp, ./%.o, $(src))
target=app
CC=g++
${target}:${obj}
${CC} $^ -o $@
%.o:%.cpp
${CC} -c $< -o $@
# .PHONY声明伪目标, 当本地有clean的同名文件时, 执行make clean不影响执行该伪目标
.PHONY:clean
clean:
#rm $(obj) $(target) -f
# - 当前命令前加-,忽略错误继续向下执行
-rm $(obj) $(target) -f
hello:
echo "hello, makefile"