"生成"不会重新编译头文件更改。尽管包含 .d 依赖项文件
Make won't recompile header file changes. Despite including .d dependency files
在我的一个非工作时间项目中,Makefile有一个非常奇怪的问题。
我有一个 Makefile(如下所示),它在 https://www.gnu.org/software/make/manual/html_node/Automatic-Prerequisites.html 之后的 .d 文件中生成依赖项信息。
问题是我的一个头文件 (shader.h) 中的更改不会触发 shader.o 的重新编译(来自 shader.cpp)。
当我重新组织项目中的目录结构时,问题最近开始发生,所以我怀疑它与此有关。
奇怪的是,如果我这样做make --print-data-base
它似乎确实找到了与 shader.d 文件匹配的正确先决条件。
二元结构如下:
|-src
|-engine
|-shader.h
|-shader.cpp
|-bin
|-Debug
|-OpenGLTest
|-obj
|-Debug
|-engine
|-shader.o
|-dep
|-engine
|-shader.d
制作文件:
WORKDIR = `pwd`
CC = gcc
CXX = g++
AR = ar
LD = g++
WINDRES = windres
INC = -I/usr/local/include
CFLAGS = -Wall -Werror
CXX_FLAGS = -std=c++11
RESINC =
LIBDIR = -L/usr/local/lib
LIB = -lSDL2 -lGLEW -framework OpenGL
LDFLAGS =
DEPDIR = dep
SRCDIR = src
INC_DEBUG = $(INC)
CFLAGS_DEBUG = $(CFLAGS) -g
RESINC_DEBUG = $(RESINC)
RCFLAGS_DEBUG = $(RCFLAGS)
LIBDIR_DEBUG = $(LIBDIR)
LIB_DEBUG = $(LIB)
LDFLAGS_DEBUG = $(LDFLAGS)
OBJDIR_DEBUG = obj/Debug
DEP_DEBUG =
OUT_DEBUG = bin/Debug/OpenGLTest
CXX_SRCS = $(wildcard $(SRCDIR)/*.cpp) $(wildcard $(SRCDIR)/**/*.cpp)
CXX_REL_SRCS = $(subst $(SRCDIR)/,,$(CXX_SRCS))
OBJS = $(CXX_REL_SRCS:%.cpp=%.o)
OBJ_DEBUG = $(addprefix $(OBJDIR_DEBUG)/,$(OBJS))
# ----------------------------- debug -----------------------------
clean: clean_debug clean_release
rm -rf $(DEPDIR)
before_debug:
@test -d bin/Debug || mkdir -p bin/Debug
@test -d $(OBJDIR_DEBUG) || mkdir -p $(OBJDIR_DEBUG)
@mkdir -p $(dir $(OBJ_DEBUG))
after_debug:
debug: before_debug out_debug after_debug
out_debug: before_debug $(OBJ_DEBUG) $(DEP_DEBUG)
$(LD) $(LIBDIR_DEBUG) -o $(OUT_DEBUG) $(OBJ_DEBUG) $(LDFLAGS_DEBUG) $(LIB_DEBUG)
$(OBJDIR_DEBUG)/%.o: $(SRCDIR)/%.cpp
$(CXX) $(CFLAGS_DEBUG) $(CXX_FLAGS) $(INC_DEBUG) -c $< -o $@
clean_debug:
rm -f $(OBJ_DEBUG) $(OUT_DEBUG)
rm -rf bin/Debug
rm -rf $(OBJDIR_DEBUG)
# ----------------------------- dependencies -----------------------------
# Generate dependencies in *.d files
$(DEPDIR)/%.d: $(SRCDIR)/%.cpp
@test -d $(DEPDIR) || mkdir -p $(DEPDIR)
@mkdir -p $(dir $@)
@set -e; rm -f $@;
$(CXX) -MM $(CFLAGS) $(CXX_FLAGS) $(INC) $< > $@.$$$$;
sed 's,(.*).o[ :]*,$(OBJDIR_RELEASE)/1.o $(OBJDIR_DEBUG)/1.o $@ : ,g' < $@.$$$$ > $@;
rm -f $@.$$$$
# Include the *.d files
include $(patsubst %,$(DEPDIR)/%.d,$(basename $(CXX_REL_SRCS)))
# ----------------------------- targets -----------------------------
.PHONY: before_debug after_debug clean_debug
all: debug
着色器:
obj/Debug/shader.o dep/engine/shader.d : src/engine/shader.cpp src/engine/shader.h
src/engine/transform.h src/engine/camera.h src/engine/constants.h
我会回答这个问题,因为 @G.M. 在评论中发现了这个问题。
事实证明,依赖生成是有缺陷的。
在着色器中,obj/Debug/shader.o
真的应该obj/Debug/engine/shader.o
。如下所示修改 sed 命令可解决此问题。
sed 's,(.*).o[ :]*,$(OBJDIR_RELEASE)/$(subst $(SRCDIR)/,,$(dir $<))1.o $(OBJDIR_DEBUG)/$(subst $(SRCDIR)/,,$(dir $<))1.o $@ : ,g' < $@.$$$$ > $@;
相关文章:
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- node-gyp 的先有鸡还是先有蛋的问题:指向依赖项中的头文件
- 提示存档文件中的动态库依赖项
- 如何在头文件中声明类模板(由于循环依赖关系)
- 对在不同二进制文件中创建的对象文件的依赖关系
- 在链接可执行文件之前查找静态库未解析的依赖项
- 在位置上运行具有依赖项的.exe文件
- 在生成文件中添加源文件并更新依赖项
- 在 Ubuntu 18.04 上,我编译的 cpp 可执行文件找不到 VTK7 依赖项
- cmake:构建依赖于非源文件.Qt帮助生成
- 更改 Cmake 文件以从源代码编译依赖项,而不是使用 FIND_PACKAGE
- 正确的生成文件依赖项列表 (C++)
- 我可以在我的 cmake 代码中手动使用 CMake 的 cpp 文件依赖项扫描程序吗?
- 将所有文件依赖于特定目录的依赖
- g++/c++生成文件依赖项以忽略boost标头
- 生成文件 - 依赖项生成
- 用于查找可执行文件依赖项的命令
- 使用 cmake 处理头文件依赖项
- 库文件依赖项冲突
- 生成文件模式规则:循环生成文件.o < - 删除生成文件依赖项