我正在尝试设置一个简单的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 回答
解决方案已经在@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
中) .所以你的解决方案是:
如果要确定模式的工作方式,可以通过向配方添加
@echo $*
行来打印模式内容 .