2015-02-23 65 views
1

我有寫入愛特梅爾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退出狀態」。當我轉到錯誤時,它會顯示代碼的結尾,而假設顯示錯誤的位置。

我無法理解我的代碼的問題。任何幫助表示讚賞。

回答

0

在您最喜歡的編輯器中打開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

0

檢查_FS_MINIMZEffconf.h是有可用的所有功能。 在我從elm-chan下載的版本中,它默認設置爲3,並導致編譯器錯誤:undefined reference。

2

恰好碰到了這一點使用使用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