使用Makefile实现增量编译报错的解决方案咨询
问题原因分析
- 目标目录子结构未创建:当前规则仅创建了BUILD_DIR顶层目录,生成子目录下的
.obj文件时(如backend/backend.obj),对应的子目录不存在,导致make无法生成目标文件,触发"无规则"错误。 - 缺少第三方依赖的编译规则:VENDORS中的源文件来自
../include目录,原Makefile仅定义了../../src下cpp文件的编译规则,未处理第三方文件的编译逻辑。 - BUILD_DIR路径不符合预期:原配置指向
../../SIN2024/x64/Debug,与你预期的ROOT_DIR/build不符。
解决步骤与修改后的Makefile
# Gather all the source files SRC = $(wildcard ../../src/*.cpp ../../src/*/*.cpp ../../src/*/*/*.cpp ../../src/*/*/*/*.cpp) VENDORS = $(wildcard ../include/glad/glad.c ../include/im3d/im3d.cpp ../include/imgui/*.cpp) # Object files (stored in ROOT/build directory) BUILD_DIR = ../../build OBJ = $(SRC:../../src/%.cpp=$(BUILD_DIR)/%.obj) $(VENDORS:../include/%.cpp=$(BUILD_DIR)/%.obj) $(VENDORS:../include/%.c=$(BUILD_DIR)/%.obj) # Include and library directories INCLUDE = -I../include -I../../src LIBS = -L../lib -lglfw3dll -lassimp # Compiler and linker flags CXX = g++ CXXFLAGS = -g --std=c++20 $(INCLUDE) CC = gcc CFLAGS = -g $(INCLUDE) # Rule to generate object files from src directory cpp files $(BUILD_DIR)/%.obj: ../../src/%.cpp @mkdir -p $(dir $@) $(CXX) $(CXXFLAGS) -c "$<" -o "$@" # Rule to generate object files from include directory cpp files (third-party) $(BUILD_DIR)/%.obj: ../include/%.cpp @mkdir -p $(dir $@) $(CXX) $(CXXFLAGS) -c "$<" -o "$@" # Rule to generate object files from include directory c files (like glad.c) $(BUILD_DIR)/%.obj: ../include/%.c @mkdir -p $(dir $@) $(CC) $(CFLAGS) -c "$<" -o "$@" # Main build target all: main.exe # Rule to link the final executable main.exe: $(OBJ) $(CXX) -o $@ $(OBJ) $(LIBS) # Clean up object files and the executable clean: rm -rf $(BUILD_DIR) main.exe
关键修改说明
- 修正BUILD_DIR路径:改为
../../build,匹配你预期的ROOT/build目录。 - 自动创建子目录:使用
mkdir -p $(dir $@)替代mkdir -p $(BUILD_DIR),$(dir $@)会自动提取目标文件所在的完整路径,确保所有子目录都被创建。 - 添加第三方文件编译规则:分别为
../include下的cpp和c文件编写编译规则,覆盖所有VENDORS源文件的编译需求。 - 明确Windows可执行文件名:将链接目标改为
main.exe,符合Windows平台的可执行文件命名规范。 - 优化VENDORS通配符:用
../include/imgui/*.cpp简化重复的ImGui文件路径,提升维护性。
内容的提问来源于stack exchange,提问作者AstralHex
相关产品推荐
相关产品推荐

