带通配符的 Makefile 目标不工作

Makefile target with wildcard is not working

我有一个简单的项目,其文件夹结构类似于:

ls -R
.:
build  include  makefile  src

./build:

./include:
myfunc.h

./src:
main.cpp  myfunc.cpp

我想将 .cpp 源代码编译成 .o 目标文件,这些文件应该以 ./build 文件夹结尾。使用 GNUmake 文档和其他资源(例如 Proper method for wildcard targets in GNU Make),我编写了这个 makefile:

CXX := g++

CXXFLAGS += -I./include
CXXFLAGS += -Wall

OBJDIR := ./build
SRCDIR := ./src

PROGRAM = release

DEPS = myfunc.h

SRC = $(wildcard $(SRCDIR)/*.cpp)
OBJ = $(patsubst $(SRCDIR)/%.cpp, $(OBJDIR)/%.o, $(SRC))

all: $(PROGRAM)

$(PROGRAM): $(OBJ)
    $(CXX) $(CXXFLAGS) -o $(PROGRAM) $(OBJ)

$(OBJDIR)/%.o: $(SRCDIR)/%.cpp $(DEPS)
    $(CXX) $(CXXFLAGS) -c $< -o $@

.PHONY: clean

clean:
    rm $(PROGRAM) $(OBJ)

但我收到错误消息:make: *** No rule to make target 'build/main.o', needed by 'release'. Stop.。我尝试了很多不同的方法,但我无法让我的 .o 文件最终出现在 ./build 目录中。相反,如果我将它们放在项目的根目录中,一切正常。我也可以通过为每个目标文件指定一个规则来使其工作,但我想避免这种情况。我错过了什么?

(我使用的是 GNUmake 4.3 版)

问题出在这里:

$(OBJDIR)/%.o: $(SRCDIR)/%.cpp $(DEPS)
    $(CXX) $(CXXFLAGS) -c $< -o $@

看到$(DEPS)了吗?扩展为 myfunc.h编译器 知道在哪里可以找到那个文件(或者如果这个配方被执行的话),因为你已经给了它 -I./include,但是 Make 不知道在哪里可以找到它(所以它忽略了这条规则)。

添加这一行:

vpath %.h include

P.S。如果你想真正干净,你可以添加一个变量:

INCDIR := ./include

CXXFLAGS += -I$(INCDIR)

vpath %.h $(INCDIR)