Makefile常用符号
前言
学习杜老师推荐的Makefile教程视频,链接。记录下个人学习笔记,仅供自己参考。
之前有转载过杜老师的从零Makefile落地算法大项目文章,感兴趣的可以看看。
本课程主要讲解Makefile中的常用符号。
1 =
- 简单的赋值运算符
- 用于将右边的值分配给左边的变量
- 如果在后面的语句中重新定义了该变量,则将使用新的值
示例如下:
HOST_ARCH = aarch64
TARGET_ARCH = $(HOST_ARCH)
# 更改了变量 a
HOST_ARCH = amd64
debug:
@echo $(TARGET_ARCH)
输出结果:
amd64
2 :=
- 立即赋值运算符
- 用于在定义变量时立即求值
- 该值在定义后不再更改
- 即使在后面的语句中重新定义了该变量
示例如下:
HOST_ARCH := aarch64
TARGET_ARCH := $(HOST_ARCH)
# 更改了变量 a
HOST_ARCH := amd64
debug:
@echo $(TARGET_ARCH)
输出结果:
aarch64
3 ?=
- 默认赋值运算符
- 如果该变量已经定义,则不进行任何操作
- 如果该变量尚未定义,则求值并分配
HOST_ARCH = aarch64
HOST_ARCH ?= amd64
debug:
@echo $(HOST_ARCH)
输出如下:
aarch64
4 累加 +=
示例如下:
include_paths := src
CXXFLAGS := -m64 -fPIC -g -O0 -std=c++11 -w -fopenmp
CXXFLAGS += $(include_paths)
debug :
@echo $(CXXFLAGS)
输出如下:
-m64 -fPIC -g -O0 -std=c++11 -w -fopenmp src
5 \
- 续行符
示例如下:
LDLIBS := cudart opencv_core \
gomp nvinfer protobuf cudnn pthread \
cublas nvcaffe_parser nvinfer_plugin
6 * 与 %
6.1 *
*
:通配符表示匹配任意字符串,可以用在目录或文件名中
*.o: *.cpp
g++ -c $< -o $@
上面的规则表示将所有的.cpp文件编译成对应的.o文件
6.2 %
%
:通配符表示模式匹配,只能用在目标中,它可以匹配一部分字符,表示一类文件
%.o: %.cpp
g++ -c $< -o $@
上面的规则表示将所有的.cpp文件编译成对应的.o文件,其中%表示与.cpp文件同名的部分
6.3 区别
*
和%
区别(from ChatGPT)
*
匹配的范围更广,可以匹配任意长度的字符串,因此它的匹配粒度更粗%
匹配的范围更窄,只匹配一个单词,因此它的匹配粒度更细
举个例子,假设我们有两个文件:
src/foo.c
src/bar.c
我们可以使用通配符*
来匹配这两个文件:
*.c
这个模式可以匹配所有以.c
结尾的文件,包括src/foo.c
和src/bar.c
。
而如果我们要匹配以src/
开头,以.c
结尾的文件,可以使用通配符%
:
src/%.c
这个模式可以匹配以src/
开头,以.c
结尾的文件,但是只匹配一个单词,也就是%
只能匹配文件名中的单个单词,不能匹配多个单词。
综上所述,通配符*
和%
都可以用于匹配一定规则的字符串,只是匹配的粒度不同,具体使用时需要根据实际情况选择合适的通配符。
总结
本次课程掌握了Makefile中常见的符号如
:=
、+=
、\
、%
。