You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复arm-none-eabi编译liboqs时的posix_memalign未定义引用错误?

解决STM32L432编译liboqs时posix_memalign未定义引用错误
  • 原因分析:STM32L432基于ARM Cortex-M4内核,通常搭配Newlib这类嵌入式C标准库,posix_memalign属于POSIX扩展接口,默认可能未被支持;而aligned_alloc是C11标准定义的内存对齐分配函数,你的工具链C库已提供该接口。

  • 解决方法:

    1. 通过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编译。

    2. 替换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的要求一致,逻辑上完全兼容。

    3. 添加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
      
    4. 自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:38:36