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
仅支持值0
和1
; f_getcwd
在这些版本中不可用。
另外,在之前的0.8版本中,有必要对C++代码,以明确包括其标题为C头,以避免名称重整:
extern "C" {
#include "ff.h"
}
从0.8版本开始,它这样做内部。如果您仍在使用旧版本,您可以找到新版本here - 您留下的评论让我相信这可能就是这种情况。
检查_FS_MINIMZE在ffconf.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是一个真正的蛇坑,如果你不”不知道你在找什么。
享受。 马特
+1认识到ASF可以是一个蛇坑,如果你不知道你在找什么。有时候,它是一根大海捞针。这是一个很棒的图书馆,但是IMO文件不全 – PhillyNJ 2017-06-21 13:11:34
它没有工作。 刚才我发现了这一点。在一个c项目中,问题就像我以前问过的那样。但在C++中,即使f_puts()也不起作用。 (未定义的引用'f_puts()',ld返回1退出状态) – 2015-02-23 11:15:40
在C++项目中,将'extern“C”{}'放在fatfs库的'#include'的附近或下载最新版本(R0。 11有内置)。 '_FS_RPATH'是否在C项目中启用'f_chdir'?在那种情况下,你使用的是什么版本的FatFS库? – Wintermute 2015-02-23 11:35:17
使用R0.11版解决了这个问题。感谢您的帮助@Wintermute – 2015-02-25 06:25:12