【问题标题】:C++ FatFs undefined reference to functionsC++ FatFs 未定义的函数引用
【发布时间】:2015-02-23 09:43:18
【问题描述】:

我有一个用 Atmel Studio 编写的代码,用于从 SD 卡读取/写入数据。我在这里使用 FatFs。我的问题是当我在 FatFs 中使用某些函数(f_chdir、f_getcwd ...)时,代码无法编译。某些功能可以正常工作(f_puts、f_open、f_mount、f_mkdir...)。所有这些函数都位于同一个头文件 (ff.h, ff.c)

错误提示“对 -function- 的未定义引用,ld 返回 1 个退出状态”。当我转到错误时,它会显示代码的结尾,而它应该显示错误的位置。

我无法理解我的代码存在的问题。任何帮助表示赞赏。

【问题讨论】:

  • 使用FatFs R0.11版本解决了这个问题。我不知道到底发生了什么。这是 4 年前我开始使用 C++ 的时候,所以我一定在某些头文件中遗漏了一些 #define

标签: c++ c atmelstudio


【解决方案1】:

刚刚在使用 SAM4S Xplained Pro(Atmel 7,ASF 3.20)的项目中使用 SD 卡遇到了这个问题。

确保您拥有所有的 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 就是一个真正的蛇坑。

享受吧。

【讨论】:

  • +1 表示如果您不知道自己在寻找什么,ASF 可能是一个蛇坑。有时它的针是大海捞针。这是一个很棒的图书馆,但 IMO 的文档记录很差。
【解决方案2】:

默认情况下,内存控制访问接口在 ASF 向导中被禁用。要启用内存控制访问,请按照以下步骤操作。

  1. 打开 ASF 向导 (Alt + W)。

  2. 如下启用内存控制访问。

ASF SD sd_mmc_mem.h 内存访问启用

  1. 最后,单击“应用”选项进行更改。

这会添加 sd_mmc_mem.h /.c 文件

【讨论】:

    【解决方案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 库的哪些功能是可配置的,因此您不必为不使用的功能丢失宝贵的 ROM 空间(以及一些字节的 RAM)。

    对于 0.8a 之前的 FatFS 库版本,_FS_RPATH 仅支持值 01f_getcwd 在这些版本中不可用。

    此外,在 0.8 之前的版本中,C++ 代码必须将其标头显式包含为 C 标头以避免名称混乱:

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

    从 0.8 版开始,它在内部执行此操作。如果您仍在使用旧版本,您可以找到新版本 here - 您留下的评论让我相信可能是这种情况。

    【讨论】:

    • 它没有用。我刚刚发现了这一点。在一个 c 项目中,问题就像我之前问的那样。但是在 c++ 中,即使 f_puts() 也不起作用。 (未定义对 'f_puts()' 的引用,ld 返回 1 个退出状态)
    • 在 C++ 项目中,将 extern "C" { } 放在 fatfs 库的 #includes 周围或下载最新版本(R0.11 已内置)。 _FS_RPATH 也没有在 C 项目中启用 f_chdir 吗?在这种情况下,您使用的是什么版本的 FatFS 库?
    • 使用R0.11版本解决了这个问题。感谢您的帮助@Wintermute
    【解决方案4】:

    检查 ffconf.h 中的 _FS_MINIMZE 是否为 0 以使所有功能都可用。 在我从 elm-chan 下载的版本中,默认设置为 3 并导致编译器错误:未定义的引用。

    【讨论】:

      【解决方案5】:

      在文件 ffconf.h 中,将 #define _USE_FIND 设置为 1。

      /* 此选项切换过滤目录读取函数 f_findfirst() 和 / f_findnext()。 (0:Disable, 1:Enable 2:Enable with altname[] too) */

      我需要使用 f_findfirst() 和 f_findnext() 函数,但我遇到了未定义的引用错误。 现在这解决了我的问题。

      【讨论】:

        【解决方案6】:

        驱动器/目录处理函数位于#if _FS_RPATH >= 1(或类似的预处理器)下。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-05-03
          • 2016-06-14
          相关资源
          最近更新 更多