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,用于防止替换文件解析失效。替换文件后缀。

文章目录