makefile 基础写法
参考链接:https://maxwell-lx.vip/basic-usage-make/
语法:
[目标]: [依赖]
(tab制表符)[命令]
目标:规则的目标,可以是 Object File(一般称它为中间文件),也可以是可执行文件,还可以是一个标签;
依赖:是我们的依赖文件,要生成 targets 需要的文件或者是另一个目标。可以是多个,也可以是没有;
命令:make 需要执行的命令(任意的 shell 命令)。可以有多条命令,每一条命令占一行。
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)
常见的自动化变量解析符
变量 | 解析 |
---|---|
$0 | 当前脚本的文件名。 |
$n | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。 |
$# | 传递给脚本或函数的参数个数。 |
$* | 传递给脚本或函数的所有参数。 |
$@ | 表示目标文件。 |
$? | 上个命令的退出状态,或函数的返回值。 |
$$ | 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。 |
$^ | 表示所有的依赖文件 |
$< | 表示第一个依赖文件 |
.PHONY,makefile的特殊变量,用于生成“伪目标”。make中的“目标”通常指文件,但有时功能和文件名会重叠。以clean为例,我们需要clean来清除全部的中间文件,但同时我们不需要真的生成一个名为"clean"文件,所以当目标文件夹存在一个“clean”文件时,“clean”功能就不会被执行,所以需要一个"伪目标"去执行“clean”功能。
wildcard,用于防止通配符解析失败。使变量定义时,括号里的通配符仍然生效。
patsubst,用于防止替换文件解析失效。替换文件后缀。