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

Manjaro环境下arm-none-eabi-g++编译报`getentropy`未定义引用问题咨询

arm-none-eabi-g编译C代码出现getentropy未定义引用的解决办法

问题背景

在Manjaro系统环境下,编译以下C++代码:

代码文件a.cpp

#include <iostream>

int main()
{
    std::cout << "hello world" << std::endl;
    return 0;
}

执行编译命令:

arm-none-eabi-g++ -specs=nosys.specs a.cpp

得到报错输出:

/usr/lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/lib/thumb/nofp/libstdc++.a(random.o): in function `std::(anonymous namespace)::__libc_getentropy(void*)':
/build/arm-none-eabi-gcc/src/gcc-12.2.0/libstdc++-v3/src/c++11/random.cc:179: undefined reference to `getentropy'
/usr/lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/lib/thumb/nofp/libstdc++.a(random.o): in function `std::random_device::_M_init(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
/build/arm-none-eabi-gcc/src/gcc-12.2.0/libstdc++-v3/src/c++11/random.cc:452: undefined reference to `getentropy'
/usr/lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/bin/ld: /usr/lib/gcc/arm-none-eabi/12.2.0/../../../../arm-none-eabi/lib/thumb/nofp/libc.a(lib_a-arc4random.o): in function `_rs_stir':
/build/arm-none-eabi-newlib/src/build-newlib/arm-none-eabi/thumb/nofp/newlib/libc/stdlib/../../../../../../../newlib-4.2.0.20211231/newlib/libc/stdlib/arc4random.c:89: undefined reference to `getentropy'
collect2: error: ld returned 1 exit status

目前arm-none-eabi-gcc编译C语言代码可成功,但arm-none-eabi-g++编译C++代码时出现上述链接错误,疑问:是否是缺少编译参数导致的?

原因与解决方案

这个问题确实是缺少编译/链接参数导致的。

原因分析

你使用了-specs=nosys.specs,说明是在无操作系统的嵌入式环境下编译。此时newlib库没有提供getentropy函数的实现,但C++标准库的random_device相关模块会依赖这个函数,链接阶段找不到对应实现就会报错。

解决办法

有两种可行的解决方式:

  1. 禁用标准库对random_device的依赖
    添加编译参数-DRANDOM_DEVICE_CXX03,这个宏会让libstdc切换到兼容C03的random_device实现,不再依赖getentropy函数。修改后的编译命令为:
arm-none-eabi-g++ -specs=nosys.specs -DRANDOM_DEVICE_CXX03 a.cpp
  1. 手动实现getentropy函数
    如果你的目标平台有硬件随机数生成器或自定义的熵源,可以自己实现getentropy函数并参与编译。例如创建entropy.c文件:
#include <stddef.h>
#include <stdint.h>

int getentropy(void *buf, size_t buflen) {
    // 根据目标平台的实际情况实现随机数据填充逻辑
    // 以下为测试用示例,生产环境请替换为真实熵源获取逻辑
    uint8_t *p = (uint8_t*)buf;
    for (size_t i = 0; i < buflen; i++) {
        p[i] = (uint8_t)(i * 0x11);
    }
    return 0;
}

然后执行编译命令:

arm-none-eabi-g++ -specs=nosys.specs a.cpp entropy.c

内容的提问来源于stack exchange,提问作者XiaoLey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 13:05:26