ARM GCC 中对 posix_memalign 的未定义引用

Posted

技术标签:

【中文标题】ARM GCC 中对 posix_memalign 的未定义引用【英文标题】:Undefined reference to posix_memalign in ARM GCC 【发布时间】:2019-05-05 23:22:32 【问题描述】:

我正在使用(STM32F407VG-Discovey board)和编译器“gcc-arm-none-eabi-7-2017-q4-major”(arm-none-eabi-gcc),我正在尝试实现“google project flatbuffers” ”。这需要运行时库 malloc.h 和堆内存。

我在我的 ARM 处理器上打开堆内存并使用 include 测试它,并尝试调用 malloc 函数的基本操作。一切正常。

现在我包含 google flatbuffers 头文件,现在我收到错误“未定义对 `posix_memalign' 的引用”。我的链接器找不到这个函数。它没有找到,但它应该已经有了它posix_memalign in stdlib.h 错误看起来像这样:

在我的 CMake 文件中,我已将标志设置为

SET(CMAKE_C_FLAGS "-mthumb -fno-builtin -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -Wall -std=gnu11 -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -fno-unroll-loops -ffast-math -ftree-vectorize -lc -lrdimon" CACHE INTERNAL "c compiler flags")

我还发现,如果我不使用标志 -lc 和 -lrdimo,将会有未定义的对 _write()、_read()、_sbrk、_exit 的引用.....

解释为什么这不重复:我知道使用 CMake 添加链接器库,您执行命令 target_link_libraries()。 这里的问题是,出于非平凡的原因,我的班轮找不到 posix_memalign 函数。但它会找到其他函数,如 malloc、alloc、free,......它们都在“stdlib.h”中。

【问题讨论】:

不,这根本不是重复的。我知道您可以通过这种方式调用 target_link_libraries() 并将标志添加到链接器,但这不是必需的。但这不是我试图解决的问题。 在链接器的调用命令行中排序库可能有问题。如果您知道CMAKE_C_FLAGS 不是链接库的正确方式,那您为什么要在代码中使用它并向我们展示该代码? 我能问一下为什么我的问题得到了反对票吗?我知道这是一个具体且有点不清楚的问题,但是,为什么? 【参考方案1】:

在 ARM ToolChain 官方网站 6.5.5. Alignment of C heap storage 部分下,它说要使用函数 `posix_memalign' 你必须使用标准 C99 而不是我设置的 C11。

所以你必须在你的CMAKE_C_FLAGS添加这个标志:-std=c99

如果您设置了标志 -std=c11,则应将其删除。

【讨论】:

【参考方案2】:

尝试使用

#include <malloc.h>
    void* p;
    p = memalign(alignment, size);

而不是

    posix_memalign(&p, alignment, size);

另见link

【讨论】:

【参考方案3】:

使用 -std=c99 对我们的团队来说不是一个可行的解决方案,因为我们有 C11 代码。

更好的解决方案是让 flatcc 使用由 flatcc 提供的通用对齐分配函数而不是 posix 函数。

在您的构建过程中,确保将 -DFLATCC_USE_GENERIC_ALIGNED_ALLOC 传递到您的编译命令行以激活这些通用版本。

定义 FLATCC_USE_GENERIC_ALIGNED_ALLOC 会激活 include/flatcc/flatcc_alloc.c 中对齐分配的通用实现。

【讨论】:

以上是关于ARM GCC 中对 posix_memalign 的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章

如何安装arm-linux-gcc

arm-linux-gcc已安装,可是编译是总是出现arm-none-linux-gnueabi-gcc:命令未找到

arm-linux-gcc4.4.3怎么安装

为啥在编译 Linux 内核和 uBoot 时使用 arm-linux-gnueabi-gcc 而不是 arm-none-eabi-gcc?

arm-linux-gcc 常用参数讲解 gcc编译器使用方法

gcc和arm-linux-gcc是啥关系?区别是啥?