You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
    $^
改动说明
  1. 主目标从$(PROJECT_NAME)改为$(OBJ_DIR)/$(PROJECT_NAME),让Make直接跟踪bin/algorithms这个文件的状态,对比它和依赖的.o文件、源文件的时间戳,只有当源文件更新时才会重新编译。
  2. run目标的依赖同步改为$(OBJ_DIR)/$(PROJECT_NAME),执行命令直接用$^引用这个依赖路径,简化写法。

现在执行make时,如果没有代码变更,会直接提示make: 'bin/algorithms' is up to date.,不会重复编译。

内容的提问来源于stack exchange,提问作者SandWood Jones

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:20:35