C++ FATFS未定义参照功能

C++ FATFS未定义参照功能

问题描述:

我有写入爱特梅尔Studio中的代码来从一个SD卡读/写数据。我在这里使用FatFs。我的问题是当我使用FatFs中的某些函数(f_chdir,f_getcwd ...)时,代码不能编译。一些函数可以正常工作(f_puts,f_open,f_mount,f_mkdir ...)。所有这些功能都位于同一头文件(ff.h,ff.c)C++ FATFS未定义参照功能

错误说“未定义参考-function-,LD返回1退出状态”。当我转到错误时,它会显示代码的结尾,而假设显示错误的位置。

我无法理解我的代码的问题。任何帮助表示赞赏。

在您最喜欢的编辑器中打开ffconf.h并将_FS_RPATH设置为2。从ffconf.h

#define _FS_RPATH  0 
/* This option configures relative path feature. 
/
/ 0: Disable relative path feature and remove related functions. 
/ 1: Enable relative path feature. f_chdir() and f_chdrive() are available. 
/ 2: f_getcwd() function is available in addition to 1. 
/
/Note that directory items read via f_readdir() are affected by this option. */ 

的FATFS库的哪些功能包含在构建是可配置的,这样你就不必失去宝贵的ROM空间(以及RAM的几个字节)为您的功能”不要使用。

对于0.8A之前FATFS库的版本,_FS_RPATH仅支持值01; f_getcwd在这些版本中不可用。

另外,在之前的0.8版本中,有必要对C++代码,以明确包括其标题为C头,以避免名称重整:

extern "C" { 
#include "ff.h" 
} 

从0.8版本开始,它这样做内部。如果您仍在使用旧版本,您可以找到新版本here - 您留下的评论让我相信这可能就是这种情况。

+0

它没有工作。 刚才我发现了这一点。在一个c项目中,问题就像我以前问过的那样。但在C++中,即使f_puts()也不起作用。 (未定义的引用'f_puts()',ld返回1退出状态) – 2015-02-23 11:15:40

+0

在C++项目中,将'extern“C”{}'放在fatfs库的'#include'的附近或下载最新版本(R0。 11有内置)。 '_FS_RPATH'是否在C项目中启用'f_chdir'?在那种情况下,你使用的是什么版本的FatFS库? – Wintermute 2015-02-23 11:35:17

+0

使用R0.11版解决了这个问题。感谢您的帮助@Wintermute – 2015-02-25 06:25:12

检查_FS_MINIMZEffconf.h是有可用的所有功能。 在我从elm-chan下载的版本中,它默认设置为3,并导致编译器错误:undefined reference。

恰好碰到了这一点使用使用SAM4S Xplained Pro的项目中的SD卡(爱特梅尔7,ASF 3.20)。

请确保您有所有的ASF项目(FATFS,sd_mmc,存储器访问控制,然后其他基本如PMC,GPIO,也许几个)。由于某种原因,我的asf没有包含sd_mmc_mem.c和sd_mmc_mem.h,所以我必须自己包含这些。还要记住在主循环的顶部执行sd_mmc_init()。至于配置...

如果仔细看看ffconf.h,它所做的第一件事情是包括conf_fatfs.h,它(等待它!)与ffconf.h是一样的文件。 。所有的变量首先被定义(并且由#ifndef FFCONF而不是CONF_FATFS保护),也就是它的位置。

进入conf_fatfs.h并将_USE_STRFUNC更改为1或2等瞧。

还要注意的是,在你使用它的地方,你必须通过#包括任何ffconf.h或conf_access.h

ASF之前的ff.h是一个真正的蛇坑,如果你不”不知道你在找什么。

享受。 马特

+0

+1认识到ASF可以是一个蛇坑,如果你不知道你在找什么。有时候,它是一根大海捞针。这是一个很棒的图书馆,但是IMO文件不全 – PhillyNJ 2017-06-21 13:11:34