我正在将(STM32F407VG-Discovey板)与编译器“ 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 ......
的未定义引用。解释为什么这不是重复的:我知道使用CM添加链接器库,使您执行命令target_link_libraries()。 这里的问题是,出于非平凡的原因,我的班轮找不到posix_memalign函数。但是它将找到其他函数,例如malloc,alloc,free,...,它们都在“ stdlib.h”中。
答案 0 :(得分:0)
在ARM ToolChain官方网站6.5.5. Alignment of C heap storage下,它表示要使用功能“ posix_memalign”,必须使用标准的C99而不是我设置的C11。
因此,您必须添加您的 CMAKE_C_FLAGS 此标志: -std = c99
如果已设置标志-std = c11,则应将其删除。
答案 1 :(得分:0)
尝试使用
#include <malloc.h>
void* p;
p = memalign(alignment, size);
代替
posix_memalign(&p, alignment, size);
另请参阅此link
答案 2 :(得分:0)
使用 -std=c99 对我们的团队来说不是一个可行的解决方案,因为我们有 C11 代码。
更好的解决方案是让 flatcc 使用 flatcc 提供的通用对齐分配函数,而不是 posix 函数。
在您的构建过程中,确保将 -DFLATCC_USE_GENERIC_ALIGNED_ALLOC 传递到您的编译命令行以激活这些通用版本。
定义 FLATCC_USE_GENERIC_ALIGNED_ALLOC 会激活 include/flatcc/flatcc_alloc.c 中对齐分配的通用实现。