GNU Make中patsubst返回空值 源码与目标文件路径替换问题求助
问题1:patsubst返回空的根因
GNU Make的内置函数对大小写敏感,你代码中调用的函数名写为了全大写的PATSUBST,而实际内置的字符串替换函数名为全小写的patsubst。Make无法识别不存在的函数,因此直接返回空值,和你的匹配规则写法无关。
修正变量定义即可:
# 将PATSUBST改为小写patsubst OBJ := $(patsubst $(SRC_DIR)%.cpp, $(OBJ_DIR)%.o, $(SRC))
修改后执行make print就能正常输出obj/main.o obj/util.o。
问题2:静态模式规则仅编译单个文件的排查方向
该问题和替换函数无关,常见原因有两个:
- 你的默认构建目标(Makefile中第一个非伪目标的目标)写在了
OBJ变量正确赋值之前,此时OBJ还没有被填充完整的目标文件列表,仅拿到了第一个值; - 目标目录
obj/未提前创建,编译第二个文件时因目录不存在报错中断,你可以在规则中增加目录依赖避免该问题。
可用的完整修正示例
SRC_DIR := source/ SRC := $(wildcard $(SRC_DIR)*.cpp) OBJ_DIR := obj/ OBJ := $(patsubst $(SRC_DIR)%.cpp, $(OBJ_DIR)%.o, $(SRC)) # 默认构建目标放在变量赋值之后,确保能拿到完整的OBJ列表 all: $(OBJ) # 静态模式规则增加目录依赖,自动创建不存在的obj目录 $(OBJ): $(OBJ_DIR)%.o : $(SRC_DIR)%.cpp | $(OBJ_DIR) $(CXX) $(CXXFLAGS) -c $< -o $@ $(OBJ_DIR): mkdir -p $@ .PHONY: print clean print: @echo $(SRC_DIR) @echo $(SRC) @echo $(OBJ_DIR) @echo $(OBJ) clean: rm -rf $(OBJ_DIR)
内容的提问来源于stack exchange,提问作者Patrick Gelvin
相关产品推荐
相关产品推荐

