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

链接报错:multiple definition问题排查(疑似Makefile配置错误)

解决C语言项目中「multiple definition」链接错误

问题根源

从make的最终输出可以看到,链接命令同时包含了inc/graphics.o、inc/snake.o和src/graphics.o、src/snake.o。这是因为你的Makefile犯了两个关键错误:

  • 错误地将inc目录下的头文件转换为对应的.o目标文件,加入到了链接列表中
  • 定义了$(HEADER)/%.o: $(SRC)/%.c规则,导致同一个源文件(如src/snake.c)被编译两次,生成两个路径不同但内容完全一致的目标文件,链接时触发重复符号冲突

修复后的Makefile

CC          := clang
CFLAGS      := -Wall -Wextra # 建议开启警告,提前发现潜在问题
PROJECT_DIR := $(shell pwd)
CFLAGS      += -I$(PROJECT_DIR)/inc # 仅需包含头文件目录,无需整个项目根目录

LDLIBS      := -lncurses

SRC         := src
HEADER      := inc
OBJ         := obj
SRCs        := $(wildcard $(SRC)/*.c)
OBJs        := main.o
OBJs        += $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SRCs)) 

BIN         := a.out

# 默认构建目标
all: $(BIN)

$(BIN): $(OBJs)
	$(CC) -o $@ $(CFLAGS) $(OBJs) $(LDLIBS) 

# 主文件编译规则
main.o: main.c $(HEADER)/*.h
	$(CC) -c $< $(CFLAGS) -o $@

# src目录源文件编译到obj目录
$(OBJ)/%.o: $(SRC)/%.c $(HEADER)/%.h $(OBJ)
	$(CC) -c $< $(CFLAGS) -o $@

# 创建obj目录
$(OBJ):
	mkdir -p $@

# 清理生成文件
clean:
	rm -f main.o
	rm -rf $(OBJ)
	rm -f $(BIN)

关键修改点

  • 移除了从头文件生成.o文件的错误逻辑,头文件不需要编译为目标文件
  • 删除了$(HEADER)/%.o规则,不再在inc目录生成冗余的目标文件
  • 将所有src目录的源文件编译到obj目录,统一管理目标文件,避免与源文件混杂
  • 修正了头文件包含路径,仅指定inc目录即可,简化编译参数
  • 优化clean规则,确保彻底清理所有生成的文件

验证修复

执行make clean && make,链接命令将仅包含main.o、obj/graphics.o、obj/snake.o,不会再出现重复的目标文件,「multiple definition」错误会消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 23:12:38