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

如何在64位Ubuntu上编译可运行于32位Armbian的C程序

错误原因

  • 静态链接报错:gethostbyname属于glibc的NSS(名称服务切换)模块,该模块设计上依赖运行时的动态加载库,就算添加-static参数强制静态链接,运行时仍会尝试加载编译用glibc版本对应的nss动态库,当Armbian系统的glibc版本与交叉编译器携带的glibc版本不一致时,就会触发解析错误。
  • 动态链接报错:交叉编译器默认的动态链接器路径、依赖库版本与Armbian运行环境不匹配,系统无法找到对应的程序加载器,因此抛出No such file or directory错误。

解决方案

方案一:使用musl libc交叉编译器(推荐)

musl libc的NSS模块完全支持静态编译,不存在glibc的版本兼容问题,操作最简单:

  1. Ubuntu上安装对应交叉编译器:
sudo apt install gcc-arm-linux-musleabi g++-arm-linux-musleabi
  1. 替换原有编译命令即可:
arm-linux-musleabi-gcc -c test.c -o test.o
arm-linux-musleabi-g++ -o test test.o -static

编译生成的全静态可执行文件可直接在32位Armbian上运行,无需额外依赖。

方案二:对齐动态链接运行环境

如果必须使用动态链接,可将Armbian的系统库同步到Ubuntu编译环境中:

  1. 将Armbian系统中的/lib、/usr/lib完整目录拷贝到Ubuntu的/opt/armbian-rootfs路径下
  2. 编译时添加sysroot和动态链接器参数:
arm-linux-gnueabi-gcc -c test.c -o test.o
arm-linux-gnueabi-g++ -o test test.o --sysroot=/opt/armbian-rootfs -Wl,-dynamic-linker=/lib/ld-linux-armhf.so.3

注意:需先在Armbian上执行ls /lib/ld-linux*确认实际动态链接器路径,将上述命令中的路径替换为实际值。

方案三:补充NSS静态库(不推荐)

如果坚持使用原有glibc交叉编译器做静态链接,可尝试添加NSS相关依赖库,兼容性不保证:

arm-linux-gnueabi-g++ -o test test.o -static -lrt -lnss_files -lnss_dns -lresolv

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:45:07