PlatformIO Arduino项目中MFRC522_I2C库多重定义错误求助
编译报错:multiple definition of `_rfidReader'
错误原因
你在Rfid.hpp头文件中直接定义了全局变量MFRC522 _rfidReader(0x28);,而头文件会被多个源文件(比如main.cpp和Rfid.cpp)包含。每个包含该头文件的源文件都会生成一个_rfidReader的独立定义,链接阶段就会触发重复定义的错误。
解决方法
方法一:使用extern声明全局变量(保持全局变量模式)
- 修改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
- 修改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类内部,避免全局变量带来的问题:
- 修改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
- 修改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
相关产品推荐
相关产品推荐

