С++ FatFs неопределенная ссылка на функции

У меня есть код, написанный в Atmel Studio для чтения/записи данных с SD-карты. Я использую FatF здесь. Моя проблема в том, что код не компилируется, когда я использую некоторые функции (f_chdir, f_getcwd...) в FatFs. Некоторые функции работают нормально (f_puts, f_open, f_mount, f_mkdir...). Все эти функции находятся в одном заголовочном файле (ff.h, ff.c).

Ошибка гласит: «неопределенная ссылка на -function-, ld вернула 1 статус выхода». Когда я перехожу к ошибке, он показывает конец кода, хотя предполагается, что он показывает, где ошибка.

Я не могу понять проблему с моим кодом. Любая помощь приветствуется.


person Teshan Shanuka J    schedule 23.02.2015    source источник
comment
Использование версии FatFs R0.11 решило проблему. Я не знаю точно, что произошло. Это было 4 года назад, когда я начал работать с C++, поэтому я, должно быть, пропустил некоторые #define в каком-то заголовочном файле.   -  person Teshan Shanuka J    schedule 19.07.2019


Ответы (6)


Только что столкнулся с этим, используя SD-карту для проекта с использованием SAM4S Xplained Pro (Atmel 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 и вуаля.

Также обратите внимание, что в местах, где вы его используете, вам нужно #include ff.h, которому предшествует либо ffconf.h, либо conf_access.h.

ASF — настоящая змеиная яма, если вы не знаете, что ищете.

Наслаждаться.

person bathMarm0t    schedule 02.06.2017
comment
+1 за признание того, что ASF может быть змеиной ямой, если вы не знаете, что ищете. Иногда это иголка — это стог сена. Это отличная библиотека, но IMO плохо документирована. - person PhillyNJ; 21.06.2017

По умолчанию интерфейс доступа к управлению памятью отключен в мастере ASF. Чтобы разрешить доступ к управлению памятью, выполните следующие действия.

  1. Откройте мастер ASF (Alt+W).

  2. Включите доступ к управлению памятью следующим образом.

Разрешить доступ к памяти ASF SD sd_mmc_mem.h

  1. Наконец, нажмите «Применить», чтобы внести изменения.

Это добавляет файлы sd_mmc_mem.h /.c.

person edmclay    schedule 17.07.2019

Откройте 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 включены в вашу сборку, можно настроить, чтобы вам не пришлось терять ценное пространство ПЗУ (а также несколько байтов ОЗУ) для функций, которые вы не используете.

Для версий библиотеки FatFS до 0.8a _FS_RPATH поддерживает только значения 0 и 1; f_getcwd недоступно в этих версиях.

Кроме того, в версиях до 0.8 необходимо, чтобы код C++ явно включал свои заголовки в качестве заголовков C, чтобы избежать искажения имен:

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

Начиная с версии 0.8, это делается внутри. Вы можете найти новые версии здесь, если вы все еще работаете со старой версией. - комментарий, который вы оставили, заставляет меня поверить, что это может быть так.

person Wintermute    schedule 23.02.2015
comment
Это не сработало. Я узнал это только сейчас. В проекте c проблема такая, как я уже спрашивал. Но в С++ даже f_puts() не работает. (неопределенная ссылка на 'f_puts()', ld вернул 1 статус выхода) - person Teshan Shanuka J; 23.02.2015
comment
В проекте C++ поместите extern "C" { } вокруг #includes для библиотеки fatfs или загрузите последнюю версию (в R0.11 она встроена). _FS_RPATH также не включает f_chdir в проекте C? В таком случае, какую версию библиотеки FatFS вы используете? - person Wintermute; 23.02.2015
comment
использование версии R0.11 решило проблему. Спасибо за помощь @Wintermute - person Teshan Shanuka J; 25.02.2015

Убедитесь, что _FS_MINIMZE в ffconf.h равно 0, чтобы были доступны все функции. В моей версии, которую я скачал с elm-chan, по умолчанию было установлено значение 3, что приводило к ошибке компилятора: неопределенная ссылка.

person LM358    schedule 21.12.2015

В файле ffconf.h задайте для #define _USE_FIND значение 1.

/* Эта опция переключает функции чтения фильтрованного каталога, f_findfirst() и / f_findnext(). (0:Отключить, 1:Включить 2:Включить с соответствующим альтернативным именем[]) */

Мне нужно было использовать функции f_findfirst() и f_findnext(), и я получал неопределенные ссылки на ошибки. Теперь это решило мою проблему.

person Muhammad Ahmed    schedule 20.05.2021

Функции обработки диска/каталога находятся в разделе #if _FS_RPATH ›= 1 (или аналогичные препроцессоры).

person Prabodini Semasinghe    schedule 08.06.2021