我有一个目录结构如下的项目:
Root directory
bin/ (for final executable)
Mod1/
build/ (for *.o / *.d files)
inc/
src/
Mod2/
build/
inc/
src/
Mod.../ (future module directories)
build/
inc/
src/
makefile
我目前的 makefile 包含以下内容:
# Directory naming conventions
SRC_DIR_NAME = src
BUILD_DIR_NAME = build
# Parallel source/object/dependency file lists
SRCS = $(shell find -name *.cpp)
OBJS = $(subst $(SRC_DIR_NAME),$(BUILD_DIR_NAME),$(SRCS:%.cpp=%.o))
# Final executable
APP = bin/app
build: $(APP)
$(APP): $(OBJS)
# link objects and compile app
%.o: %.cpp
# compile sources into objects
我的文件列表按预期工作并产生:
SRCS=./mod1/src/file.cpp ./mod2/src/file.cpp
OBJS=./mod1/build/file.o ./mod2/build/file.o
DEPS=./mod1/build/file.d ./mod2/build/file.d
然而,当我运行 make 命令时,出现了以下错误:
make: *** No rule to make target `mod1/build/file.o', needed by `/bin/app'. Stop.
我的假设是:
%.o: %.cpp
无法处理类似于
mod1/build/file.o
的输入。是否有一种通用的方法,可以使用模块目录创建目标,并为该模块的对象文件创建目标,这些目标需要在各自的子目录中使用该模块的源文件?
我知道使用递归 make 可以解决此问题,但如果可能的话,我想避免使用该解决方案。