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

C语言GCC编译出现多重定义及函数未定义引用错误排查

问题根本原因

你遇到的多重定义错误,核心是头文件中全局变量的声明方式不符合C语言的多文件编译规则,具体逻辑如下:

  1. C语言中,int someVar1;这种不带extern修饰的全局变量写法属于试探性定义(Tentative Definition),本质是带初始化的定义,而非纯声明。每一个包含了command.h的.c源文件,在预处理展开头文件后,都会单独生成一份someVar1的全局变量定义。
  2. 你同时编译command.c和my_algorithm.c时,两个源文件都包含了command.h,生成的两个目标文件里都存在someVar1、someVar2等变量的定义,链接器无法判断该使用哪一份,就会抛出多重定义错误。
  3. 之前单编译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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:06:05