【问题标题】:Recursive makefile for c++ sourcec++ 源代码的递归生成文件
【发布时间】:2017-07-10 13:41:08
【问题描述】:

我一直在为 makefile 苦苦挣扎,因为我真的不明白它们是如何工作的......

我的目录结构如下:

--bin/
--build/
--includes/
--src/
----classes/
------somefiles.hpp
------somefiles.cpp
----states/
------somestates.hpp
----main.cpp
----few-other-files.cpp
--Makefile
--.gitignore

在我开始添加这些子目录 classesstates 之前,这在我的 makefile 中运行良好

我似乎找不到如何在我的 makefile 中包含这些子目录:

CC := g++
SRCDIR := src
BUILDDIR := build
TARGET := bin/game

SRCEXT := cpp
SOURCES := $(shell find $(SRCDIR) -type f -name *.$(SRCEXT))
OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:.$(SRCEXT)=.o))
CFLAGS := -g -Wall
LIB := -lsfml-audio -lsfml-graphics -lsfml-network -lsfml-system -lsfml-window
INC := -I includes -I /usr/local/include -L /usr/local/lib

$(TARGET): $(OBJECTS)
    @echo "Linking..."
    @echo "$(CC) $^ -o $(TARGET) $(LIB)"; $(CC) $^ -o $(TARGET) $(LIB)

$(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT)
    @mkdir -p $(BUILDDIR)
    @echo "$(CC) $(CFLAGS) $(INC) -c -o $@ $<"; $(CC) $(CFLAGS) $(INC) -c -o $@ $<

clean:
    @echo "Cleaning..."
    @echo "$(RM) -r $(BUILDDIR) $(TARGET)"; $(RM) -r $(BUILDDIR) $(TARGET)

.PHONY: clean

问题:Fatal error: can't create build/classes/stateManager.o: No such file or directory

通常,问题在于它无法构建目录。但我认为mkdir -p 会解决这个问题。

非常感谢任何帮助。

【问题讨论】:

  • 但是你只做mkdir -p $(BUILDDIR),它等于mkdir -p build。不创建子目录(如classes)。您可能对dir 函数感兴趣(例如,请参阅this make file-function manual)。
  • 对“递归生成文件”一词也有一点吹毛求疵。递归生成文件是调用自身的生成文件,通常在子目录中。您的 makefile 不是递归的。
  • 最终结果为:@mkdir -p $(shell dirname $@),如果我是对的?
  • 你可能想看看VPATHvpath
  • @mkdir -p $(dir $@)

标签: c++ makefile


【解决方案1】:

替换:

mkdir -p $(BUILDDIR)

mkdir -p $(@:D)

另一种方法是让make 将目录视为目标并自动为您创建它们,这样您就不必使用mkdir -p 调用来弄乱您的食谱:

.SECONDEXPANSION:
# Make the object file depend on its directory using order-only dependency.
$(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT) | $$(dir $$@)
    $(CC) $(CFLAGS) $(INC) -c -o $@ $<

# Let make create the directories for your targets.
%/:
    mkdir -p $@

# Do not remove the directories because they are "intermediate" targets.
.PRECIOUS : %/

【讨论】:

  • 效果很好!谢谢你的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
  • 2013-06-24
  • 2011-02-28
  • 2014-08-14
  • 2023-02-03
相关资源
最近更新 更多