【发布时间】:2014-06-20 12:37:13
【问题描述】:
目前,每当我执行make 时,我的makefile 都会告诉我
make: `some/obj/file.o' 是最新的。
无论我是否编辑了生成该目标文件所涉及的任何文件。如何让它检测更改?这是一个重现问题的简单生成文件:
SHELL := /bin/bash
src := src
sources := $(shell find $(srcDir) -name "*.cpp")
objects := $(sources:%.cpp=%.o)
-include $(sources:%.cpp=%.d)
all: prog
prog: $(objects)
g++ $(objects) -o /a.out
%.o: %.cpp
$(CXX) $(CXXFLAGS) -MMD -MP -c $< -I $(srcDir) -o $@
clean:
find $(srcDir) -type f -iname "*.o" -delete
find $(srcDir) -type f -iname "*.d" -delete
目前我必须每次运行make clean 才能重新编译,这显然不理想!
编辑:这是我根据 Chnossos 的回答所做的尝试:
EXE := a.out
SRCDIR := src
SRC := $(shell find $(srcDir) -name "*.cpp")
DIR := .obj
OBJ := $(SRC:%.cpp=$(DIR)/%.o)
DEP := $(OBJ:.o=.d)
CXXFLAGS += -std=c++11
CXXFLAGS += -I /home/arman/lib/eigen-eigen-6b38706d90a9
CXXFLAGS += -I /home/arman/lib/boost_1_55_0
CXXFLAGS += -I /home/arman/lib/lodepng/
CXXFLAGS += -L /home/arman/lib/boost_1_55_0/stage/lib
CPPFLAGS += -MMD -MP
.PHONY: all clean
-include $(DEP)
all: $(EXE)
$(EXE): $(OBJ)
$(CXX) $(OBJ) -o $@
$(DIR)/%.o: %.cpp
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $< -I $(SRCDIR)
clean:
$(RM) -f $(DIR)
我现在收到以下错误:
src/core/file1.cpp:839:1: 致命错误:打开依赖文件 .obj/./src/core/file1.d: 没有这样的文件或目录
请注意,我有以下目录结构:
/prog/makefile -> 生成文件 /prog/dir1/ -> 一些 cpp/hpp 文件 /prog/dir2/ -> 更多 cpp/hpp 文件 /prog/ -> 这里也有一些 cpp/hpp 文件
我有很多文件夹(不仅仅是dir1 和dir2),所以我不想每次都指定它们。
【问题讨论】: