目前,无论什么时候{my}我的makefile告诉我
make:`some / obj / file.o'是最新的。
无论我是否编辑了生成该目标文件所涉及的任何文件。如何让它检测到变化?这是一个简单的makefile,可以重现问题:
make
目前我每次都必须运行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
才能重新编译,这显然不太理想!
编辑:以下是基于Chnossos答案的尝试:
make clean
我现在收到以下错误:
src / core / file1.cpp:839:1:致命错误:打开依赖项文件.obj /./ src / core / file1.d:没有这样的文件或目录
请注意,我有以下目录结构:
/ prog / makefile - &gt; makefile / prog / dir1 / - &gt;一些cpp / hpp文件 / prog / dir2 / - &gt;更多cpp / hpp文件 / prog / - &gt;这里也有一些cpp / hpp文件
我有很多文件夹(不只是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)
和dir1
),所以我不想每次都指定它们。
答案 0 :(得分:2)
SRC := $(wildcard *.cpp)
OBJ := $(SRC:.cpp=.o)
DEP := $(OBJ:.o=.d)
CPPFLAGS += -MMD -MP -I.
.PHONY: all clean
all: prog
prog: $(OBJ)
$(CXX) $(LDFLAGS) $^ $(LDLIBS)
-include $(DEP)
clean:
$(RM) $(OBJ) $(DEP)
您还可以稍加努力将.o
和.d
文件编译成隐藏文件夹,如下所示:
EXE := a.out
SRC := $(wildcard *.cpp)
DIR := .obj
OBJ := $(SRC:%.cpp=$(DIR)/%.o)
DEP := $(OBJ:.o=.d)
CPPFLAGS += -MMD -MP -I.
.PHONY: all clean
all: $(EXE)
$(EXE): $(OBJ)
$(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@
$(DIR)/%.o: %.cpp | $(DIR)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<
$(DIR):
@mkdir $@
-include $(DEP)
clean:
$(RM) -r $(DIR)
编辑:以下是我的编辑尝试:
请注意,$(LDLIBS)
标志位于-l
,而$(LDFLAGS)
标志位于-L
。
SRCDIR := src
OBJDIR := .obj
EXE := a.out
SRC := $(shell find $(SRCDIR) -name "*.cpp")
OBJ := $(SRC:$(SRCDIR)/%.cpp=$(OBJDIR)/%.o)
DEP := $(OBJ:.o=.d)
LDFLAGS += -L /home/arman/lib/boost_1_55_0/stage/lib
CXXFLAGS += -std=c++11
CPPFLAGS += -I $(SRCDIR)
CPPFLAGS += -I /home/arman/lib/eigen-eigen-6b38706d90a9
CPPFLAGS += -I /home/arman/lib/boost_1_55_0
CPPFLAGS += -I /home/arman/lib/lodepng/
CPPFLAGS += -MMD -MP
.PHONY: all clean
all: $(EXE)
$(EXE): $(OBJ)
$(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@
.SECONDEXPANSION:
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp | $$(@D)/
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<
%/:
mkdir $@
-include $(DEP)
clean:
$(RM) -r $(OBJDIR)
告诉我是否缺少某些东西。
答案 1 :(得分:1)
-M
gcc选项系列(-MM
,-MMT
)生成您需要的makefile片段。标准技术是
DEPS := $(SOURCES:.c=.d)
.c.d:
$(CC) -o $< -MM $(CFLAGS)
-include $(DEPS)