【发布时间】:2017-04-04 21:08:16
【问题描述】:
我有一个makefile,如下,可以编译链接同一目录下的所有cpp文件:
g++1x:=g++ -std=c++14 -stdlib=libc++ -MMD -MP
cflags:= -Wall -lncurses
TARGET:=matrix.out
CPPFILES:=$(wildcard *.cpp)
OBJDIRECTORY:=.obj
OBJFILES:=$(addprefix $(OBJDIRECTORY)/,$(notdir $(CPPFILES:.cpp=.o)))
.PHONY: install
install: $(OBJDIRECTORY) $(TARGET)
$(OBJDIRECTORY):
mkdir -p $(OBJDIRECTORY)
$(TARGET): $(OBJFILES)
$(g++1x) $(cflags) -o $@ $^ -g
$(OBJDIRECTORY)/%.o: %.cpp
#%.o: %.cpp
$(g++1x) -c -o $@ $< -g
-include $(addprefix $(OBJDIRECTORY)/,$(notdir $(CPPFILES:.cpp=.d)))
.PHONY: clean
clean:
rm -f $(TARGET)
rm -rf $(OBJDIRECTORY)
当我执行make 时,将创建一个.obj 并且所有的obj 文件都在其中。也会生成一个可执行文件。现在一切都很好。
现在我正在尝试组织我的项目。我的计划是创建一些子目录,每个子目录都包含一个 makefile。当我执行 makefile 时,它会在某个固定路径生成 obj 文件。最后,我可以执行一个makefile来链接main.cpp和所有的obj文件来获取可执行文件。
但我不知道如何为子目录编写这样的makefile。我已经尝试如下,但它不起作用。
project
|--- main.cpp
|--- makefile
|--- subdir
|--- test.h
|--- test.cpp
|--- makefile
这是我在project/subdir 中的makefile:
g++1x:=g++ -std=c++14 -stdlib=libc++ -MMD -MP
cflags:= -Wall -lncurses
CPPFILES:=$(wildcard *.cpp)
OBJDIRECTORY:=../.obj
TARGET:=$(OBJDIRECTORY)/%.o
OBJFILES:=$(addprefix $(OBJDIRECTORY)/,$(notdir $(CPPFILES:.cpp=.o)))
.PHONY: install
install: $(OBJDIRECTORY) $(TARGET)
$(OBJDIRECTORY):
mkdir -p $(OBJDIRECTORY)
$(TARGET): %.cpp
#%.o: %.cpp
$(g++1x) -c $@ $< -g
-include $(addprefix $(OBJDIRECTORY)/,$(notdir $(CPPFILES:.cpp=.d)))
.PHONY: clean
clean:
rm $(OBJDIRECTORY)/%.o
错误:
make: *** 没有规则来制作目标
../.obj/%.o', needed byinstall'。 停下来。
【问题讨论】:
-
您可能想阅读aegis.sourceforge.net/auug97.pdf 上的论文“Recursive Make Considered Harmful”。