从Ubuntu 20.04升级到22.04后出现gcc multiple definition of错误求解
解决Ubuntu 22.04中全局变量重复定义问题
你遇到的问题根源是在头文件中直接定义全局变量:头文件的包含保护(#ifndef/#define)仅能防止单个源文件重复包含该头文件,但每个包含global.h的.c文件(a.c和b.c)都会各自生成一份int a;和int b;的变量定义,链接阶段就会触发重复定义冲突。
至于Ubuntu 20.04未报错的原因:当时的GCC默认启用-fcommon选项,该选项会自动合并多个文件中重复的全局变量定义;而Ubuntu 22.04的GCC默认使用-fno-common(符合C标准的严格行为),因此会直接报错。
方法一:标准全局变量用法(推荐)
修改global.h,仅声明变量而非定义:
#ifndef GLOBAL_H #define GLOBAL_H extern int a; extern int b; #endif
随后在任意一个.c文件中定义这两个变量(例如在a.c的main函数前添加):
int a; int b;
这样整个程序中仅存在一份变量定义,所有源文件通过extern声明共享这两个全局变量。
方法二:临时兼容旧编译行为(不推荐)
若需快速兼容原有代码,可在编译时添加-fcommon选项,让GCC回到Ubuntu 20.04的默认行为:
gcc -O -fcommon a.c b.c
该方法不符合C标准规范,长期使用可能引发潜在问题,不建议在新代码中采用。
内容的提问来源于stack exchange,提问作者user1602885
相关产品推荐
相关产品推荐

