我有一个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
错误:
制作:***没有规则可以使目标
../.obj/%.o', needed by
安装'。 停止。
答案 0 :(得分:1)
不要将文件放在路径的父级中;解决问题:在Makefile
子目录的根目录中有$(MAKE)
并在那里使用obj文件。
答案 1 :(得分:0)
这里有几个问题。
在原始的makefile中,变量TARGET
包含字符串&#34; matrix.out&#34;,一切都很好。
在subdir/makefile
中,变量TARGET
包含字符串&#34; ../。obj /%。o&#34;,并且您要求Make to build 那。它能找到的唯一规则是:
$(TARGET): %.cpp
...
没有帮助,因为没有名为&#34;%。cpp&#34;的文件。 的任何地方
我建议你尝试这样的事情:
install: $(OBJFILES)
$(OBJFILES): $(OBJDIRECTORY)/%.o: %.cpp $(OBJDIRECTORY)
$(g++1x) -c $@ $< -g
一旦你开始工作,你可以担心让主makefile调用sun-make的问题。