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

时间:2017-03-23 18:06:19

标签: makefile gnu-make

我试图设置一个简单的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 :(得分:0)

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

模式规则将模式保存在%符号中。如果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 $*行来打印模式内容。