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

多翻译单元使用全局变量遇Duplicate global variable错误求助

解决C语言全局变量重复定义问题

问题原因

你在头文件中直接写:

int g_exit_status;

这属于变量的定义,当多个源文件(比如main.c和parsing.c)包含这个头文件时,每个编译后的目标文件(.o)里都会生成一个g_exit_status的定义,链接器合并这些目标文件时就会报重复符号错误,也就是你看到的:

duplicate symbol '_g_exit_status' in:
/var/folders/zz/zyxvpxvq6csfxvn_n0000kch0004l4/T/main-422e60.o
/var/folders/zz/zyxvpxvq6csfxvn_n0000kch0004l4/T/parsing-328bc4.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [minishell] Error 1

正确做法

  • 头文件声明变量:用extern关键字声明变量,告诉编译器这个变量在其他地方定义:

    // 头文件(比如globals.h)
    extern int g_exit_status;
    

    每个包含该头文件的源文件都能识别这个变量,但不会生成新的定义。

  • 单个源文件定义并初始化:选一个源文件(比如main.c),在这里完成变量的定义并设置初始值:

    // main.c
    #include "globals.h"
    
    // 仅在这里定义一次,设置初始值90
    int g_exit_status = 90;
    
  • 其他源文件使用变量:需要使用该变量的源文件,直接包含头文件即可正常读写:

    // parsing.c
    #include "globals.h"
    
    // 示例:修改变量值
    g_exit_status = 100;
    

这样编译链接时就不会出现重复符号错误,同时能在多个翻译单元中共享这个全局变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:42:47