ARM GCC 中对 posix_memalign 的未定义引用
Undefined reference to posix_memalign in ARM GCC
我正在使用 (STM32F407VG-Discovey 板) 和编译器 "gcc-arm-none-eabi-7-2017-q4-major" (arm-none-eabi-gcc),我正在尝试实现 "google project flatbuffers"。这需要 运行 时间库 malloc.h 以及堆内存。
我在我的 ARM 处理器上打开堆内存并使用 include 测试它并尝试调用 malloc 函数的基本操作。一切正常。
现在我包含 google flatbuffers 头文件,现在我得到错误 "undefined reference to `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" 中。
在 ARM ToolChain 官方网站的 6.5.5. Alignment of C heap storage 部分,它说要使用函数“posix_memalign”,您必须使用标准 C99 而不是我设置的 C11。
所以你必须在你的CMAKE_C_FLAGS中添加这个标志:-std=c99
如果您设置了标志 -std=c11,则应将其删除。
尝试使用
#include <malloc.h>
void* p;
p = memalign(alignment, size);
而不是
posix_memalign(&p, alignment, size);
另请参阅此 link
使用 -std=c99 对我们的团队来说不是一个可行的解决方案,因为我们有 C11 代码。
更好的解决方案是让 flatcc 使用 flatcc 提供的通用对齐分配函数,而不是 posix 函数。
在您的构建过程中,确保将 -DFLATCC_USE_GENERIC_ALIGNED_ALLOC 传递到您的编译命令行以激活这些通用版本。
定义 FLATCC_USE_GENERIC_ALIGNED_ALLOC 激活 include/flatcc/flatcc_alloc.c 中对齐分配的通用实现。
我正在使用 (STM32F407VG-Discovey 板) 和编译器 "gcc-arm-none-eabi-7-2017-q4-major" (arm-none-eabi-gcc),我正在尝试实现 "google project flatbuffers"。这需要 运行 时间库 malloc.h 以及堆内存。
我在我的 ARM 处理器上打开堆内存并使用 include 测试它并尝试调用 malloc 函数的基本操作。一切正常。
现在我包含 google flatbuffers 头文件,现在我得到错误 "undefined reference to `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" 中。
在 ARM ToolChain 官方网站的 6.5.5. Alignment of C heap storage 部分,它说要使用函数“posix_memalign”,您必须使用标准 C99 而不是我设置的 C11。
所以你必须在你的CMAKE_C_FLAGS中添加这个标志:-std=c99
如果您设置了标志 -std=c11,则应将其删除。
尝试使用
#include <malloc.h>
void* p;
p = memalign(alignment, size);
而不是
posix_memalign(&p, alignment, size);
另请参阅此 link
使用 -std=c99 对我们的团队来说不是一个可行的解决方案,因为我们有 C11 代码。
更好的解决方案是让 flatcc 使用 flatcc 提供的通用对齐分配函数,而不是 posix 函数。
在您的构建过程中,确保将 -DFLATCC_USE_GENERIC_ALIGNED_ALLOC 传递到您的编译命令行以激活这些通用版本。
定义 FLATCC_USE_GENERIC_ALIGNED_ALLOC 激活 include/flatcc/flatcc_alloc.c 中对齐分配的通用实现。