gpt4 book ai didi

c++ - 如何确保我的 makefile 检测到头文件和 cpp 文件中的更改?

转载 作者:太空狗 更新时间:2023-10-29 20:59:56 24 4
gpt4 key购买 nike

目前,每当我执行 make 时,我的 makefile 都会告诉我

make: `some/obj/file.o' is up to date.

无论我是否编辑了生成该目标文件所涉及的任何文件。我如何让它检测到变化?这是一个重现问题的简单 makefile:

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: fatal error: opening dependency file .obj/./src/core/file1.d: No such file or directory

请注意,我有以下目录结构:

/prog/makefile -> 生成文件/prog/dir1/-> 一些 cpp/hpp 文件/prog/dir2/-> 更多 cpp/hpp 文件/prog/-> 这里也有一些 cpp/hpp 文件

我有很多文件夹(不仅仅是 dir1dir2)所以我不想每次都指定它们。

最佳答案

EXE := a.out
SRC := $(wildcard *.cpp)
OBJ := $(SRC:.cpp=.o)
DEP := $(OBJ:.o=.d)

CPPFLAGS := -MMD -MP -I.

.PHONY: all clean

all: $(EXE)

$(EXE): $(OBJ)
$(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@

clean:
$(RM) $(OBJ) $(DEP)

-include $(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 $@

clean:
$(RM) -r $(DIR)

-include $(DEP)

编辑:这是我对您的编辑的尝试:

请注意,$(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)

CPPFLAGS := -MMD -MP
CPPFLAGS += -I$(SRCDIR)
CPPFLAGS += -I$(HOME)/lib/eigen-eigen-6b38706d90a9
CPPFLAGS += -I$(HOME)/lib/boost_1_55_0
CPPFLAGS += -I$(HOME)/lib/lodepng/
CXXFLAGS := -std=c++11
LDFLAGS += -L$(HOME)/lib/boost_1_55_0/stage/lib
LDLIBS :=

.PHONY: all clean

all: $(EXE)

$(EXE): $(OBJ)
$(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@

.SECONDEXPANSION:
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp | $$(@D)/
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<

%/:
mkdir -p $@

clean:
$(RM) -r $(OBJDIR)

-include $(DEP)

如果缺少什么,请告诉我。

关于c++ - 如何确保我的 makefile 检测到头文件和 cpp 文件中的更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23451652/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com