常用语法
若有
clean:
rm -rf *.o
有叫做clean的文件,则再执行make clean时,将不会执行rm命令。
为了解决这个问题,需要
.PHONY: clean
以使得clean作为总是需要更新执行的目标
各自动变量含义:
$@ 目标文件的完整名称
$^ 所有不重复的依赖文件,以空格分开
$< 第一个依赖文件的名称
$* 不包含扩展名的目标文件名称
$? 所有时间戳比目标文件晚的依赖文件,并以空格分开
$% 如果目标是归档成员,则该变量表示目标的归档成员名称
使用
include $(HOME_TREE)/mak_common.inc
直接导入其他文件的文本
使用
make -C $(SUB_DIR)
编译子目录相应makefile
典型模板
自动编译同一个目录下的所有文件
SOURCE = $(wildcard *.cpp)
OBJS = $(SOURCE:%.cpp=%.o)
#OBJS = $(patsubst %.cpp,%.o,$(SOURCE))
CFLAGS += -D DEBUG
CLFAGS += -Wall
CLFAGS += `pkg-config --cflags opencv`
LDFLAGS += -lm -lrt -pthread lib_somelib.a
LDFLAGS += `pkg-config --libs opencv`
PROGRAM = Test
INCLUDE_DIR = include
OBJ_DIR = obj
CXX = g++
all:$(PROGRAM)
$(PROGRAM):$(OBJ_DIR)/$(OBJS)
$(CXX) $(LDFLAGS) $^ -o $@
include $(SOURCE:.cpp=.d)
$(OBJ_DIR)/%.o:%.cpp
$(CXX) $(CFLAGS) $(INCLUDE_DIR) -c $< -o $@
%.d: %.cpp
@set -e; rm -f $@; \
$(CXX) -MM $(CFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
.PHONY:clean
clean:
rm -f $(OBJ_DIR)/$(OBJS) *.d $(PROGRAM)
第一行使用我wildcard得到所有.cpp文件路径。
在Makefile规则中,除在变量的定义和函数引用时,通配符会自动展开。此时需要显式使用wildcard,用法$(wildcard PATTERN…) 。它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。
第二行给出所有.o文件名,二三行应该是等价的
详细资料
http://carbs.lofter.com/post/7f79f_bb95d
总之,Make工具从理论上几乎可以满足编译过程的所有要求。但由于其大量的符号和语法规则,学习难度相当于一门语言。而其带来的好处并不对等。