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. Чтобы включить доступ для управления памятью, выполните следующие действия.
Откройте мастер ASF (Alt + W).
Включите доступ к управлению памятью следующим образом.
ASF SD sd_mmc_mem.h разрешение доступа к памяти
- Наконец, нажмите кнопку "Применить", чтобы внести изменения.
Это добавляет файлы 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 (или аналогичными препроцессорами).