多翻译单元使用全局变量遇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
相关产品推荐
相关产品推荐

