Linux系统编程04-Makefile
-
文件命名: makefile 或 Makefile
-
规则:
-
一个Makefile文件中可以有一个或多个规则
目标 ...: 依赖 ...
命令(shell命令)
...
-
目标: 最终生成的文件
-
依赖: 生成目标所需要的文件或者目标
-
命令: 通过执行命令对依赖操作生成目标(命令前必须tab缩进)
-
-
命令在执行之前, 需要先检查规则中的依赖是否存在
-
检测更新, 在执行规则中的命令时, 会比较目标和依赖文件的时间
-
自定义变量 : 变量名=变量值
var=hello
; 获取变量:$(var)
-
预定义变量:
- AR: 归档维护程序的名称, 默认ar
- CC: C编译器的名称, 默认cc
- CXX: C++编译器名称, 默认g++
- $@: 目标的完整名称
- $<: 第一个依赖文件的名称
- $^: 所有依赖文件
-
函数:
$(wildcard PATTERN...)
- 获取指定目录下指定类型的文件列表
- 参数:PATTERN 指的是某个或多个目录下的对应的某种类型的文件,如果有多个目录,一般使用空格间隔
- 返回:得到的若干个文件的文件列表,文件名之间使用空格间隔
- 示例:
$(wildcard *.c ./sub/*.c)
返回值格式:a.c b.c c.c d.c e.c f.c
$(patsubst <pattern>,<replacement>,<text>)
- 查找
中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式 ,如果匹配的话,则以 替换。 - 返回:函数返回被替换过后的字符串
- 示例:
$(patsubst %.c, %.o, x.c bar.c)
返回值格式:x.o bar.o
- 查找
示例:
# VERSION 1
# hello: main.cpp printhello.cpp factorial.cpp
# g++ -o hello main.cpp printhello.cpp factorial.cpp
# VERSION 2
# CXX = g++
# TARGET = hello
# OBJ = main.o printhello.o factorial.o
# $(TARGET): $(OBJ)
# $(CXX) -o $(TARGET) $(OBJ)
# main.o: main.cpp
# $(CXX) -c main.cpp
# printhello.o: printhello.cpp
# $(CXX) -c printhello.cpp
# factorial.o: factorial.cpp
# $(CXX) -c factorial.cpp
# VERSION 3
# CXX = g++
# TARGET = hello
# OBJ = main.o printhello.o factorial.o
# CXXFLAGS = -c -Wall
# $(TARGET): $(OBJ)
# $(CXX) -o $@ $^
# %.o: %.cpp
# $(CXX) $(CXXFLAGS) $< -o $@
# .PHONY: clean
# clean:
# rm -f *.o $(TARGET)
# VERSION 4
CXX = g++
TARGET = hello
SRC = $(wildcard *.cpp)
OBJ = $(patsubst %.cpp, %.o, $(SRC));
CXXFLAGS = -c -Wall
$(TARGET): $(OBJ)
$(CXX) -o $@ $^
%.o: %.cpp
$(CXX) $(CXXFLAGS) $< -o $@
.PHONY: clean
clean:
rm -f *.o $(TARGET)