在Arduino IDE中调用SD库sd_diskio.cpp内部函数遇编译错误求助
调用Arduino SD库内部函数的编译问题解决
问题描述
使用Arduino IDE时,尝试调用SD库中sd_diskio.cpp内的内部函数,编写的代码如下:
#include <sd_diskio.h> #include <SPI.h> #define SD_MMC_CLK 7 #define SD_MMC_CMD 9 #define SD_MMC_D0 8 #define SD_MMC_D3_CS 21 void setup() { Serial.begin(9600); uint8_t ssPin = SD_MMC_D3_CS; SPI.begin(SD_MMC_CLK, SD_MMC_D0 ,SD_MMC_CMD, SD_MMC_D3_CS); SPIClass spi = SPI; uint32_t frequency = 4000000; uint8_t pdrv = sdcard_init(ssPin, &spi, frequency); if (!sdSelectCard(pdrv)) { return 0; } if (!sdCommand(pdrv, SEND_CID, 0, NULL)) { char cid[16]; bool success = sdReadBytes(pdrv, cid, 16); sdDeselectCard(pdrv); if (success) { Serial.println(cid); } } }
编译过程中先后遇到两个错误:
- 初始错误:
error: 'sdcard_init' was not declared in this scope
- 解决第一个错误后出现新错误:
error: 'sdSelectCard' was not declared in this scope
已知sdSelectCard未在sd_diskio.h中定义,尝试通过Sketch->Add File添加sd_diskio.cpp但无效,需要解决如何让Arduino IDE将该文件纳入编译的问题。
解决方案
方法一:复制库文件到项目目录(推荐)
- 找到SD库的
sd_diskio.cpp和sd_diskio.h文件,通常路径为Arduino/libraries/SD/src/ - 将这两个文件复制到你的Arduino项目文件夹中
- 修改代码中的头文件引用,把
<sd_diskio.h>改为"sd_diskio.h"(双引号表示引用本地项目内的头文件) - 重新打开Arduino IDE,项目面板会显示这两个文件,编译时会自动将它们纳入编译流程
方法二:修改库头文件(不推荐,库更新会失效)
找到SD库的sd_diskio.h文件,在文件末尾添加需要调用的内部函数声明,示例如下:
// 手动添加需要的函数声明 uint8_t sdcard_init(uint8_t ssPin, SPIClass *spi, uint32_t frequency); bool sdSelectCard(uint8_t pdrv); bool sdCommand(uint8_t pdrv, uint8_t cmd, uint32_t arg, uint8_t *response); bool sdReadBytes(uint8_t pdrv, uint8_t *buffer, size_t count); void sdDeselectCard(uint8_t pdrv);
添加完成后,编译器就能识别这些函数的声明,配合库中sd_diskio.cpp的实现代码,即可正常调用。
关于Sketch->Add File无效的原因
Arduino IDE的Add File功能仅能添加项目目录内的文件,而SD库的sd_diskio.cpp属于系统库文件,直接添加后如果头文件引用还是指向系统库路径,IDE不会将其纳入项目编译。只有将文件复制到项目目录并修改引用路径,才能确保文件被编译。
内容的提问来源于stack exchange,提问作者Dinamo
相关产品推荐
相关产品推荐

