带通配符的 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)
我有一个简单的项目,其文件夹结构类似于:
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)