如何确保我的makefile检测到header和cpp文件中的更改?

时间:2014-05-04 01:36:00

标签: c++ makefile

目前,无论什么时候{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),所以我不想每次都指定它们。

2 个答案:

答案 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)