首页 文章

Makefile模式匹配不能按我的预期工作

提问于
浏览
0

我正在尝试设置一个简单的Makefile来构建一个不太难维护的简单项目 .

我想利用模式匹配规则,例如 %.o : %.c ; g++ ... 其中我有我想要编译的所有目标文件,这些文件是从通配符匹配的源文件中推导出来的 .

目录结构是

./src
./include
./build/bin
./build/objs

现在我的问题看起来像这样 .

INCL_DIR = ./include
SRC_DIR = ./src

BUILD_DIR = ./build
BIN_DIR = $(BUILD_DIR)/bin
OBJ_DIR = $(BUILD_DIR)/objs

SRCS = $(notdir $(wildcard $(SRC_DIR)/*.cc))
OBJS = $(addprefix $(OBJ_DIR)/, $(SRCS:%.cc=%.o))

$(BIN_DIR)/program : $(OBJS)
    $(CXX) $(CXXFLAGS) -I $(INCL_DIR) $^ -o $@

$(OBJS):%.o : %.cc
    $(CXX) $(CXXFLAGS) -I $(INCL_DIR) -c $< -o $@

$(OBJS):%.o : %.cc 行中,示例扩展将来自目标规则 ./build/objs/a.o ,它取决于 ./build/objs/a.cc ,但源文件位于 ./src/a.cc 中 .

所以我想我可以去除依赖格式以尝试匹配 ./src/a.cc 但是文本操作的实用程序似乎不适用于规则的依赖性方面 .

我试过类似的东西

$(OBJS):%.o : $(SRC_DIR)/$(notdir %.cc)

要么

$(OBJS):%.o : $(SRC_DIR)/$(*F).cc

$(*F) 在前面的示例中将扩展为 a ,但在列为依赖项时不会扩展为任何内容 .

我没有使用Makefiles,也不确定为什么我的尝试不起作用,并且非常希望听到可以解决我的问题的解决方案 .

谢谢 .

1 回答

  • 0

    解决方案已经在@John的评论中 . 我将尝试更详细地解释它 . 我将在文件夹 src 中使用 hello.cc 的示例 .

    模式规则在 % 符号中保存模式 . 如果makefile中有一个模式规则: build/objs/%.o : src/%.cc 并且您请求构建文件 build/objs/hello.o% 将携带值 hello . 但是如果您的模式规则是 $(OBJS):%.o : %.cc ,则模式 % 将为 build/objs/hello 且缺少依赖性文件 build/objs/hello.cc (因为它保存在 src 中,而不是 build/objs 中) .

    所以你的解决方案是:

    $(OBJS):$(OBJ_DIR)%.o : $(SRC_DIR)%.cc
        $(CXX) $(CXXFLAGS) -I $(INCL_DIR) -c $< -o $@
    

    如果要确定模式的工作方式,可以通过向配方添加 @echo $* 行来打印模式内容 .

相关问题