Linux编程系列——makefile

  • 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"

猜你喜欢

转载自blog.csdn.net/gripex/article/details/105370312