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

添加extern变量后Makefile出现multiple definition错误求助

问题分析与解决方案

一、多重定义错误的根源

你在useful_func.h中写的extern const char *foo[] = {..., ...};是错误写法:

  • extern关键字用于声明变量(告知编译器变量在其他文件中定义),但一旦添加赋值= {..., ...},语句就变成了定义变量。
  • 每个包含该头文件的.c文件(如program_1.c、program_2.c、useful_func.c)编译时都会生成一个foo的定义,链接阶段就会触发「多重定义」错误。
  • 头文件保护(#ifndef...#endif)仅能防止单个.c文件重复包含头文件,无法解决跨文件的重复定义问题。

二、代码修复步骤

  1. 修改头文件(useful_func.h):仅保留变量声明,删除赋值操作:
#ifndef __USEFUL_FUNC_H__
#define __USEFUL_FUNC_H__

// 仅声明变量,告知编译器foo在其他文件中定义
extern const char *foo[];

// 其他函数声明...
#endif
  1. 修改实现文件(useful_func.c):在该文件中添加变量的定义与赋值(整个项目仅定义一次):
#include "useful_func.h"

// 定义并初始化foo,全局唯一
const char *foo[] = {"value1", "value2", ...};

// 其他函数实现...

三、Makefile优化(解决冗余编译问题)

当前Makefile存在重复编译问题(如useful_func.c会被编译3次:prog_1、prog_2、main各编译一次),且依赖关系不够清晰。以下是优化后的版本,采用先编译目标文件(.o)再链接的方式,更高效且符合规范:

CC := gcc
CFLAGS := -Wall -g
LDFLAGS := -lm -lpthread

SRC_DIR := src
# 自动获取src目录下所有.c文件
SRCS := $(wildcard $(SRC_DIR)/*.c)
# 生成对应的.o文件
OBJS := $(SRCS:.c=.o)

# 目标可执行文件
TARGETS = prog_1 prog_2 main

.PHONY: all clean

all: $(TARGETS)

# 编译单个.o文件的通用规则
$(SRC_DIR)/%.o: $(SRC_DIR)/%.c
	$(CC) $(CFLAGS) -c $< -o $@

# 编译prog_1:依赖自身.o和useful_func.o
prog_1: $(SRC_DIR)/prog_1.o $(SRC_DIR)/useful_func.o
	$(CC) $^ -o $@ $(LDFLAGS)

# 编译prog_2:依赖自身.o和useful_func.o
prog_2: $(SRC_DIR)/prog_2.o $(SRC_DIR)/useful_func.o
	$(CC) $^ -o $@ $(LDFLAGS)

# 编译main:依赖自身.o、useful_func.o,同时确保prog_1和prog_2已编译完成
main: $(SRC_DIR)/main.o $(SRC_DIR)/useful_func.o prog_1 prog_2
	$(CC) $^ -o $@ $(LDFLAGS)

clean:
	$(RM) $(TARGETS) $(OBJS)

优化点说明:

  • 用wildcard自动获取所有源文件,避免手动逐个添加;
  • 通用规则编译.o文件,减少重复代码;
  • 链接时仅使用已编译的.o文件,避免重复编译同一源文件;
  • 明确依赖关系:prog_1/prog_2依赖各自的.o和useful_func.o,main依赖自身.o、useful_func.o以及已编译完成的prog_1/prog_2可执行文件;
  • 保留-g调试选项,方便后续调试。

四、验证修复

  1. 执行make clean清理旧编译文件;
  2. 执行make重新编译,此时多重定义错误应消失;
  3. 测试生成的可执行文件是否正常运行。

内容的提问来源于stack exchange,提问作者13-0-G

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:35:17