C语言GCC编译出现多重定义及函数未定义引用错误排查
问题根本原因
你遇到的多重定义错误,核心是头文件中全局变量的声明方式不符合C语言的多文件编译规则,具体逻辑如下:
- C语言中,
int someVar1;这种不带extern修饰的全局变量写法属于试探性定义(Tentative Definition),本质是带初始化的定义,而非纯声明。每一个包含了command.h的.c源文件,在预处理展开头文件后,都会单独生成一份someVar1的全局变量定义。 - 你同时编译
command.c和my_algorithm.c时,两个源文件都包含了command.h,生成的两个目标文件里都存在someVar1、someVar2等变量的定义,链接器无法判断该使用哪一份,就会抛出多重定义错误。 - 之前单编译
command.c时没有出现变量重定义错误,是因为只有一个编译单元生成了变量实例,当时的报错只是因为缺少modifying_loop函数的实现。
解决方案
按以下两步修改即可解决问题:
- 第一步:修改
command.h中的全局变量声明,全部加上extern修饰,变成纯声明,只告知编译器变量存在,不生成实际定义,同时添加头文件守卫防止单文件重复包含:
// command.h #ifndef COMMAND_H #define COMMAND_H extern int someVar1; extern int someVar2; void modifying_loop (int a, int b); extern int someVar3; // 其余变量同理加extern修饰 #endif
- 第二步:选任意一个
.c源文件(推荐选command.c,或者专门建一个存放公共变量实现的global.c),在全局作用域下正常定义这些变量,整个程序仅保留这一份定义即可:
// command.c 中添加全局变量定义 #include "command.h" // 全局变量唯一定义 int someVar1; int someVar2; int someVar3; // 其余变量同理在此定义 int main () { modifying_loop(5,6); return 0; }
修改后重新使用gcc -o command command.c my_algorithm.c -lm -lpigpio -L/usr/lib/编译即可正常通过。
内容的提问来源于stack exchange,提问作者HDEV5
相关产品推荐
相关产品推荐

