【发布时间】: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
在我开始添加这些子目录 classes 和 states 之前,这在我的 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函数感兴趣(例如,请参阅thismakefile-function manual)。 -
对“递归生成文件”一词也有一点吹毛求疵。递归生成文件是调用自身的生成文件,通常在子目录中。您的 makefile 不是递归的。
-
最终结果为:
@mkdir -p $(shell dirname $@),如果我是对的? -
你可能想看看
VPATH和vpath。 -
或
@mkdir -p $(dir $@)