如何修复arm-none-eabi编译liboqs时的posix_memalign未定义引用错误?
posix_memalign未定义引用错误 原因分析:STM32L432基于ARM Cortex-M4内核,通常搭配Newlib这类嵌入式C标准库,
posix_memalign属于POSIX扩展接口,默认可能未被支持;而aligned_alloc是C11标准定义的内存对齐分配函数,你的工具链C库已提供该接口。解决方法:
通过CMake选项切换内存分配函数
检查liboqs的CMake配置选项,若存在控制内存分配方式的参数(如OQS_USE_ALIGNED_ALLOC),直接在cmake配置命令中添加:cmake -GNinja -DCMAKE_TOOLCHAIN_FILE=../.CMake/toolchain_armel.cmake -DOQS_USE_OPENSSL=OFF -DOQS_USE_ALIGNED_ALLOC=ON ..重新配置后执行
ninja编译。替换liboqs源码中的
posix_memalign调用
若liboqs无相关配置选项,直接修改源码中调用posix_memalign的代码,替换为aligned_alloc:
原代码示例:int ret = posix_memalign(&ptr, 16, size); if (ret != 0) { // 错误处理 }修改为:
void *ptr = aligned_alloc(16, size); if (ptr == NULL) { // 错误处理(对应原ret非0的情况) }注:
aligned_alloc要求size必须是alignment的整数倍,这和posix_memalign的要求一致,逻辑上完全兼容。添加C11标准支持
确保CMake配置启用C11标准(aligned_alloc是C11特性),可在工具链文件toolchain_armel.cmake中添加:set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON)或在cmake命令行追加参数:
-DCMAKE_C_STANDARD=11 -DCMAKE_C_STANDARD_REQUIRED=ON自定义
posix_memalign包装函数
若不想修改liboqs源码,可编写一个包装函数用aligned_alloc实现posix_memalign,将其编译进项目:
创建posix_memalign_wrapper.c文件:#include <stdlib.h> int posix_memalign(void **memptr, size_t alignment, size_t size) { *memptr = aligned_alloc(alignment, size); return *memptr == NULL ? -1 : 0; }在CMake配置中,将该文件添加到liboqs的编译源列表,或编译为静态库后链接到项目中。
内容的提问来源于stack exchange,提问作者tarun14110

