makefile:如何生成目标文件到上层目录

时间:2017-04-04 21:08:16

标签: c++ c makefile

我有一个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安装'。   停止。

2 个答案:

答案 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的问题。