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

Posted

技术标签:

【中文标题】makefile:如何生成目标文件到上层目录【英文标题】:makefile: how to generate object files to upper directory 【发布时间】: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”。 【参考方案1】:

不要将文件放在路径的父级中;解决问题:在根目录中有一个Makefile$(MAKE)s 是子目录并在那里使用 obj 文件。

【讨论】:

【参考方案2】:

这里有几个问题。

在您的原始 makefile 中,变量 TARGET 包含字符串“matrix.out”,一切正常。

在您的subdir/makefile 中,变量TARGET 包含字符串“../.obj/%.o”,您要求Make 构建那个。它可以找到的唯一规则:

$(TARGET): %.cpp
    ...

没有帮助,因为没有名为“%.cpp”的文件任何地方

我建议你试试这样的:

install: $(OBJFILES)

$(OBJFILES): $(OBJDIRECTORY)/%.o: %.cpp $(OBJDIRECTORY)
    $(g++1x) -c $@ $< -g

一旦你开始工作,你就可以担心让主makefile调用sun-makes的问题。

【讨论】:

以上是关于makefile:如何生成目标文件到上层目录的主要内容,如果未能解决你的问题,请参考以下文章

Makefile:如何写目标依赖

从stem中的文件名生成makefile目标依赖项

在LINUX中Makefile中的依赖文件放在啥地方? 生成的目标文件在啥地方?makefile 是啥类型的文件?

Makefile伪目标

如何强制生成文件重建目标?

每次将目标文件转储到其他目录时都会重建makefile