在 Ubuntu 24 上搞交叉编译,提示工具链 No such file or directory

事情是这样的。

打开 Eclipse IDE,配好工程,满怀期待地点下 Build。

然后,报错了。

复制代码
/home/user/Desktop/sdk/bin/toolchain-wrapper.br_real: No such file or directory

我盯着这行字看了好一会儿。

toolchain-wrapper.br_real,No such file or directory。

文件不存在。

可问题是,我明明看见那个 toolchain-wrapper 就在 /home/user/Desktop/sdk/host/bin/ 目录下面,白纸黑字。那它说找不到是什么意思?

绕就绕在这儿,toolchain-wrapper 明明在,但它跑不起来,因为它自己找不到它依赖的东西。

在 x86 的 PC 上写代码,但最终要跑在 ARM 芯片上,比如 GD32、STM32 这类单片机,或者更复杂的 RK3568 这种处理器。电脑没法直接编译出能在 ARM 上运行的二进制文件,所以需要一套「交叉编译工具链」,arm-linux-gcc 就是这里面最核心的那个编译器。

用 Buildroot 生成的工具链,里面有一个包装脚本叫 toolchain-wrapper,它会调用真正的编译器 toolchain-wrapper.br_real

一个是壳,一个是核心。壳调核心,才能干活。

而我遇到的问题,不是壳找不到,是壳找不到核心。

排查第一步,我没在 Eclipse 里继续耗,而是直接拉了个终端,单独跑 arm-linux-gcc 看看,

bash 复制代码
arm-linux-gcc --version

直接挂了,

复制代码
/home/user/Desktop/sdk/bin/toolchain-wrapper.br_real: No such file or directory

连版本都查不到。这说明不是 Eclipse 的问题,是工具链本身在这台机器上就跑不起来。

这一下把范围缩小了很多,问题出在环境,不是 IDE 配置。

那环境里少什么?

然后我去网上搜了一下,旧教程清一色说,在 Ubuntu 上跑 32 位的 ARM 工具链,需要先装这两个库,

复制代码
lib32ncurses5
lib32z1

好,照着装,

bash 复制代码
sudo apt install lib32ncurses5 lib32z1

然后就,

复制代码
E: Unable to locate package lib32ncurses5

lib32ncurses5 这个包在 Ubuntu 24.04 里压根不存在了。

这个坑埋得还挺深的,因为网上百分之八十的教程,都是基于 Ubuntu 18、20 甚至更老的版本写的,那时候这个包还在。Ubuntu 24 把包名改了,但教程还在到处传。照着做,然后发现 apt 找不到这个包,还以为是自己哪里配错了。

遇到这种「包不存在」,正确的姿势是先别乱投医,用 apt-cache search 查一下实际有哪些可用的,

bash 复制代码
apt-cache search lib32ncurses

输出是这样的,

复制代码
lib32ncurses-dev - developer's libraries for ncurses (32-bit)
lib32ncurses6 - shared libraries for terminal handling (32-bit)
lib32ncursesw6 - shared libraries for terminal handling (wide character support) (32-bit)

哦。

不是 lib32ncurses5,是 lib32ncurses6

Ubuntu 24 用的 ncurses 库已经升到了 6.x,所以包名也跟着变了。lib32ncurses5 就像是 Windows XP 时代的驱动,早就被淘汰了,但旧教程里还在引用它。

明白了,就差这个。

回到正题,三步,做完就好了。

首先,必须先开启系统的 32 位架构支持,这一步很多人漏掉,

bash 复制代码
sudo dpkg --add-architecture i386

然后更新软件源,加了新架构之后必须更新一次,否则 apt 找不到 i386 的包,

bash 复制代码
sudo apt update

最后装正确版本的 32 位库,记住 lib32ncurses5 换成 lib32ncurses6lib32z1 这个不变,

bash 复制代码
sudo apt install lib32ncurses6 lib32z1

装完验证一下,

bash 复制代码
arm-linux-gcc --version

这次不再报 toolchain-wrapper.br_real: No such file or directory 了,正常输出版本信息。

然后回 Eclipse,重新 Build,顺利跑起来。

说到这儿,可能有人想问,toolchain-wrapper.br_real 找不到,跟 32 位库有什么关系?

关系在于,toolchain-wrapper.br_real 这个二进制文件本身就是 32 位的 ELF 可执行文件。

Buildroot 生成的 ARM 交叉编译工具链,出于历史原因,里面的核心二进制往往是 32 位编译的。跑起来要加载 32 位的动态库,libncurses、libz,这些都得是 32 位版本。系统里没有,动态链接器没办法把这个文件加载进内存,然后报出来的错就是「No such file or directory」。

但指的不是文件本身找不到,是依赖的共享库没有。

这个报错设计得真的有点让人误导。

说文件不存在,其实是依赖不满足,文件就在那儿摆着,但跑不起来。

类比一下,就像手里有一张 DVD,光驱也在,但 DVD 播放器少了某个解码库,系统提示「无法打开该文件」,而不是「缺少解码库」。

被这个报错迷惑,完全正常。

顺着上面这个再聊一下,Eclipse 里遇到这类环境问题,为什么特别难排查。

Eclipse 做嵌入式是很多人的主力工具,但它的报错有时候包了好几层,实际上底层是 Make 调 arm-linux-gcc,arm-linux-gcc 调 toolchain-wrapper,toolchain-wrapper 再去跑 .br_real,哪一层出问题,最终显示出来的都是同一行报错,没有调用栈,没有依赖列表。

而 VSCode 配合 CMake 或者直接用命令行的时候,报错往往更原始,反而更容易定位。

这不是说 Eclipse 不好用,只是提醒一下,以后 Eclipse 里看到奇怪报错,多拉一个终端,直接在命令行里单独执行那个出问题的命令,往往能看到更清晰的错误。

就像这次,一个 arm-linux-gcc --version,立刻就把问题暴露出来了。

坦率的讲,这不是最后一次会遇到这种问题。

Ubuntu 从 22 到 24,包名的变化不仅仅是 lib32ncurses5 这一个,很多旧的开发依赖包都经历了版本号更新或者改名。每次参考一篇几年前的教程,都要有一个心理预期,里面的包名、命令、路径,可能都跟 Ubuntu 24 对不上。

遇到 E: Unable to locate package xxx 的时候,先别慌,用 apt-cache search 查一下,大概率能找到新名字或者替代方案。

这个习惯,能省掉很多莫名其妙的折腾。

最后把完整流程贴一下,直接抄去用,

bash 复制代码
# 开启32位架构支持(必须先执行)
sudo dpkg --add-architecture i386

# 更新软件源
sudo apt update

# 安装正确版本的32位库(Ubuntu 24 用 lib32ncurses6)
sudo apt install lib32ncurses6 lib32z1

# 验证工具链
arm-linux-gcc --version

做完这四步,再回 Eclipse 编译,toolchain-wrapper.br_real 的报错就消失了。

这个问题本身不难,主要还是被旧教程带偏了方向。


既然看到这里了,如果觉得不错,随手点个赞、在看、转发三连吧,如果想第一时间收到推送,也可以给个星标⭐~

相关推荐
Uncertainty!!1 小时前
Ubuntu下Zotero与Prism高效文献管理指南
ubuntu·zotero·overleaf·prism
蛐蛐蛐1 小时前
使用Frp实现内网穿透以访问内网Win11远程桌面
网络·ubuntu
Hunter_pcx3 小时前
ubuntu:内存假泄漏
linux·运维·服务器·开发语言·c++·人工智能·ubuntu
刘一说3 小时前
Ubuntu 系统上安装 Docker
linux·ubuntu·docker
openinstall全渠道统计3 小时前
电商App推广统计方案有哪些?从广告到下单追踪解析
java·eclipse·教育电商
AI帮小忙3 小时前
Debian/Ubuntu 系操作系统 Kali2026 & 银河麒麟V10 使用对比
ubuntu·debian
什么都会一点儿的自动驾驶工程狮4 小时前
Jetson Orin Nano Super + Ubuntu 22.04 + ROS2 Humble + Autoware Universe
linux·ubuntu·elasticsearch
Languorous.5 小时前
Linux发行版区别——CentOS、Ubuntu、Debian、Rocky怎么选?
linux·ubuntu·centos
信必诺5 小时前
C# —— VS2022配置终端程序跨平台发布方法(部署Ubuntu22.04举例,详细多图)
ubuntu·c#·跨平台部署