我试图设置一个简单的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,也不确定为什么我的尝试不起作用,并且非常希望听到可能解决我问题的解决方案。
感谢。
答案 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 $*
行来打印模式内容。