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

PlatformIO Arduino项目中MFRC522_I2C库多重定义错误求助

编译报错:multiple definition of `_rfidReader'

错误原因

你在Rfid.hpp头文件中直接定义了全局变量MFRC522 _rfidReader(0x28);,而头文件会被多个源文件(比如main.cpp和Rfid.cpp)包含。每个包含该头文件的源文件都会生成一个_rfidReader的独立定义,链接阶段就会触发重复定义的错误。

解决方法

方法一:使用extern声明全局变量(保持全局变量模式)

  1. 修改Rfid.hpp:将变量定义改为外部声明,仅告知编译器变量存在,不分配内存
#ifndef _RFID_HPP_
#define _RFID_HPP_

#include "../lib/rfidReader/MFRC522_I2C.h"

// 声明外部变量,不在这里定义
extern MFRC522 _rfidReader;

class Rfid
{
private:
  /* data */
public:
  Rfid(/* args */);
  ~Rfid();
  void setupRfid();
  void rfidLoop();
};

#endif
  1. 修改Rfid.cpp:在cpp文件中定义变量,确保全局仅存在一份
#include "Rfid.hpp"

// 在这里真正定义全局变量,仅初始化一次
MFRC522 _rfidReader(0x28);

Rfid::Rfid(/* args */)
{
}

Rfid::~Rfid()
{
}

void Rfid::setupRfid()
{
  _rfidReader.PCD_Init();
}

void Rfid::rfidLoop()
{
    // 你的RFID读取代码
}

方法二:将变量改为类成员(更符合封装原则)

把RFID阅读器实例封装到Rfid类内部,避免全局变量带来的问题:

  1. 修改Rfid.hpp:将_rfidReader改为类的私有成员
#ifndef _RFID_HPP_
#define _RFID_HPP_

#include "../lib/rfidReader/MFRC522_I2C.h"

class Rfid
{
private:
  // 类内部的RFID阅读器实例
  MFRC522 _rfidReader;
public:
  Rfid();
  ~Rfid();
  void setupRfid();
  void rfidLoop();
};

#endif
  1. 修改Rfid.cpp:通过构造函数初始化阅读器地址
#include "Rfid.hpp"

// 初始化列表中设置RFID的I2C地址
Rfid::Rfid() : _rfidReader(0x28)
{
}

Rfid::~Rfid()
{
}

void Rfid::setupRfid()
{
  _rfidReader.PCD_Init();
}

void Rfid::rfidLoop()
{
    // 你的RFID读取代码
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:30:47