Makefile输出可执行文件到bin目录时重复编译的解决方法
问题根源
你当前的Makefile里,主目标是$(PROJECT_NAME)(也就是algorithms),但实际生成的可执行文件是bin/algorithms。Make会默认在当前目录寻找与目标同名的文件,找不到就会判定这个目标需要重新构建——这就是为什么每次执行make都会重复编译的原因。
修复方案
把主目标的名称改成实际生成的文件路径$(OBJ_DIR)/$(PROJECT_NAME),让Make能正确关联目标和对应的文件,从而通过时间戳判断是否需要重新编译。修改后的完整Makefile如下:
PROJECT_NAME = algorithms INCL_DIR =./include CC=gcc CFLAGS= -g -Wall -I$(INCL_DIR) SRC_DIR = ./src SRC_FILES = $(wildcard $(SRC_DIR)/*.c) OBJ_DIR = ./bin OBJ_FILES = $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(SRC_FILES)) .PHONY: clean run # 修改主目标为实际文件路径 $(OBJ_DIR)/$(PROJECT_NAME): $(OBJ_FILES) $(CC) -o $@ $^ $(CFLAGS) $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c mkdir -p $(OBJ_DIR) $(CC) -c -o $@ $< $(CFLAGS) clean: rm -f $(OBJ_DIR)/%.o $(OBJ_DIR)/$(PROJECT_NAME) rm -rf $(OBJ_DIR) # 修改run目标的依赖和执行命令 run: $(OBJ_DIR)/$(PROJECT_NAME) $^
改动说明
- 主目标从
$(PROJECT_NAME)改为$(OBJ_DIR)/$(PROJECT_NAME),让Make直接跟踪bin/algorithms这个文件的状态,对比它和依赖的.o文件、源文件的时间戳,只有当源文件更新时才会重新编译。 run目标的依赖同步改为$(OBJ_DIR)/$(PROJECT_NAME),执行命令直接用$^引用这个依赖路径,简化写法。
现在执行make时,如果没有代码变更,会直接提示make: 'bin/algorithms' is up to date.,不会重复编译。
内容的提问来源于stack exchange,提问作者SandWood Jones
相关产品推荐
相关产品推荐

