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

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

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

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

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 - настоящая змеиная яма, если вы не знаете, что ищете.

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

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

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

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

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

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

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

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

Открой 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, он делает это внутренне. Вы можете найти новые версии здесь, если вы все еще работаете со старой - оставленный вами комментарий приводит меня к мысли, что это может быть так.

В файле ffconf.h установите #define _USE_FIND на 1.

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

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

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

Другие вопросы по тегам