✳相遇
导航

Ubuntu 下嵌入式开发环境排障实录:应用菜单、图标、Eclipse 交叉编译

2112 字
11 分钟
Ubuntu 下嵌入式开发环境排障实录:应用菜单、图标、Eclipse 交叉编译

引言#

一天之内,从桌面应用到 Eclipse 交叉编译链,连着踩了五个坑。每一个问题都不算难,但排查过程里藏着不少值得沉淀的思路。这篇记录把它们整理出来,既是对自己的一次复盘,也希望给同样在 Ubuntu 下做嵌入式开发的朋友一些参考。

五个问题分别是:

  1. 桌面应用不显示在应用程序菜单里
  2. 应用图标显示成齿轮
  3. 虚拟机磁盘空间告急
  4. Eclipse 打不开已有工程
  5. 交叉编译构建报错

下面逐一展开。


一、桌面应用不显示在应用程序菜单里#

现象#

新装的应用(如 CC Switch、v2rayN)在启动器(Activities 概览)里搜不到,应用菜单里也没有。

根因#

GNOME 的应用菜单是从 ~/.local/share/applications/ 和 /usr/share/applications/ 下的 .desktop 文件生成的。应用没出现,通常有这几种原因:

  • 应用本体不是标准的安装方式(比如 AppImage、便携版压缩包),没有对应的 .desktop 文件;
  • 已有 .desktop 文件,但带了 NoDisplay=true,只作为协议处理器(如 ccswitch:// URL handler),故意不在菜单里显示;
  • .desktop 文件指向的路径不对(应用移动过位置)。

处理#

  1. 把应用本体放到稳定位置,比如 ~/.local/share/<应用名>/,避免放在 Downloads 里被清理;
  2. 创建 ~/.local/share/applications/<应用名>.desktop,关键字段:
[Desktop Entry]
Type=Application
Name=应用名
Exec="/home/user/.local/share/应用名/可执行文件" %u
Icon=图标名
Terminal=false
Categories=Development;
  1. 安装图标到 ~/.local/share/icons/hicolor/<尺寸>/apps/;
  2. 执行 update-desktop-database ~/.local/share/applications/ 刷新菜单缓存。

思路沉淀#

应用不显示 = 先问自己:这个应用有没有 .desktop 文件?路径对不对?是不是被 NoDisplay 隐藏了?

菜单的生成机制决定了排查顺序,逐项对照即可,不需要猜。


二、应用图标显示成齿轮#

现象#

应用能打开了,但菜单里的图标是一个齿轮(通用图标),而不是应用自己的图标。

根因#

图标文件明明装到了 ~/.local/share/icons/hicolor/256x256/apps/,但 GNOME 找不到。查下去发现:~/.local/share/icons/hicolor/ 目录里缺少 index.theme 文件。

index.theme 是图标主题的”定义文件”,告诉系统这个目录是一个图标主题、有哪些尺寸。没有它,gtk-update-icon-cache 无法生成正确的 icon-theme.cache 索引,GNOME 解析图标名失败,就回退到了通用齿轮图标。

处理#

Terminal window
# 1. 从系统复制 index.theme
cp /usr/share/icons/hicolor/index.theme ~/.local/share/icons/hicolor/
# 2. 强制重建图标缓存
sudo gtk-update-icon-cache -f -t ~/.local/share/icons/hicolor/
# 3. 补齐常用尺寸(48/64/96/128/256)
# 从 256x256 缩放生成即可

思路沉淀#

图标变齿轮 = 图标没被图标主题索引到。查三件事:文件位置对不对、文件名和 .desktop 里 Icon 字段是否一致、icon-theme.cache 是否生成。

这次卡点是第三个——缓存没生成,而缓存没生成是因为缺 index.theme。这类”配置项缺失导致索引失败”的问题,靠看报错看不出名堂,要顺着机制往下查一层。


三、虚拟机磁盘空间告急#

现象#

df -h 显示根分区用了 87%,剩余空间紧张。

排查方法#

  1. 先看全局:df -h
  2. 再看大户:du -sh ~/* 2>/dev/null | sort -rh
  3. 逐层深入,直到找到具体的大文件/大目录

找到的大头#

项目大小说明
重复的源码副本21G同一份 Linux SDK 的拷贝,非 git 仓库,可删
tracker3 文件索引缓存7.1GGNOME 文件索引,可安全清理
VMware 拖拽缓存3.4G可安全清理
pip 下载缓存2.5G删了只是下次下载慢点
Anaconda 安装包~1G装完就没用了

处理要点#

  • 删除前先验证:特别是大文件、源码目录,先确认是重复副本(对比文件数、MD5)再删,防止误删;
  • 缓存类(tracker3、vmware、pip)可直接清;
  • 安装包类(.sh、.deb)确认软件已装好后可删;
  • 系统级清理(apt clean、旧内核)需要 sudo,可在终端手动执行或用 pkexec。

思路沉淀#

清理磁盘,先定位再动手,删除大文件前先验证。

磁盘清理的风险在于误删。宁可多花两分钟对比文件,也不要手滑删掉开发中的源码。


四、Eclipse 打不开已有工程#

现象#

用 Eclipse 打开之前创建好的 C/C++ 工程(嵌入式项目),左侧工程视图是空的,看不到项目。

根因(层层排查)#

第一层:工作区不对。 用 eclipse -data /path 启动时报错,因为 Ubuntu snap 版 Eclipse 的启动包装脚本把所有参数都拼到了 -vmargs 之后,-data 被当成 JVM 参数导致启动失败。解决:直接 eclipse 不带参数启动,用默认工作区。

第二层:工程注册状态残缺。 工程虽在 .metadata 里有记录(.location 指向源码目录),但 .props(打开状态)缺失,属于历史遗留的”残次”注册。解决:备份后清除 .projects/PU 注册,重新导入工程。

第三层:CDT 插件没装。 工程加载时报 Unknown referenced nature: org.eclipse.cdt.core.cnature——这是 C/C++ 工程标志性的 CDT nature,说明这个 Eclipse 是 Java 版,没装 C/C++ 开发工具(CDT)。解决:通过 p2 director 命令行安装 CDT。

安装 CDT 的坑#

用 p2 director 安装时卡了很久,最后发现是代理问题:系统里 CC Switch 等工具设置的本地代理(127.0.0.1:10808)拦截了 Eclipse 的下载请求。取消代理环境变量 + 同时指定 Eclipse 平台仓库和 CDT 仓库才能装成功:

Terminal window
unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY
/snap/eclipse/146/eclipse -configuration ... \
-application org.eclipse.equinox.p2.director \
-repository https://download.eclipse.org/releases/2026-06/,https://download.eclipse.org/tools/cdt/releases/12.5/ \
-installIUs org.eclipse.cdt.feature.group

思路沉淀#

Eclipse 工程不显示,从外到内排查:工作区 → 工程注册 → 插件能力(nature)→ 构建配置。

嵌入式 C/C++ 工程高度依赖 CDT,换了环境(新装的 Eclipse)最容易缺的就是它。Unknown referenced nature 是定位”缺插件”的关键信号。


五、交叉编译构建报错#

现象#

工程能打开了,但一构建就报:

Errors running builder 'CDT Builder' on project 'PU'.
Cannot invoke "IOutputType.getOutputExtensions(ITool)" because "outType" is null

根因#

报错来自工程的 Cross GCC(交叉编译)构建配置。CDT 12.5 这个新版本移除了 Cross GCC 工具链的内置定义(cdt.managedbuild.toolchain.gnu.cross.base、cdt.managedbuild.option.gnu.cross.prefix 等 ID 都不存在了)。旧工程 .cproject 里引用的工具链 ID 在新版本里解析失败,构建时就空指针了。

处理#

工程自带的旧版 Eclipse 里恰好有一个插件 org.eclipse.cdt.build.crossgcc,里面定义了完整的 Cross GCC 工具链。把它复制到新 Eclipse 的插件目录,再用 -clean 重启:

Terminal window
cp /旧Eclipse/plugins/org.eclipse.cdt.build.crossgcc_*.jar \
/新Eclipse/plugins/
# 然后带 -clean 参数重启 Eclipse,强制重新扫描插件

交叉编译库缺失#

工程链接时报 cannot find -lch347。这是 WCH(沁恒)CH347 USB 芯片的库。系统里只有头文件,没有库文件。从 WCH 官方 GitHub 仓库找到预编译的 64 位动态库(注意仓库里有 32 位和 64 位两种,一定要选对),装到 /usr/local/lib 并执行 ldconfig。

Terminal window
sudo cp libch347.so /usr/local/lib/
sudo ldconfig
# 验证链接器能找到
ldconfig -p | grep ch347

思路沉淀#

升级工具链后旧的构建配置失效 = 版本把定义移走了。找”定义缺失”的根因,而不是反复重装。

这次的关键转折点:报错是 NPE,看堆栈只能知道是工具链解析失败,但要往深处想”这个 ID 在新版本里还在不在”。对比新旧版本的插件列表,发现缺一个专门的 crossgcc 插件——问题迎刃而解。


总结:一套通用的排障思路#

今天五个问题,表面各不相同,背后其实共用一套思路:

  1. 先还原机制,再动手修。 不管是菜单、图标缓存还是构建系统,先搞明白”这东西是怎么工作的”,排查顺序自然就有了。
  2. 看报错要看关键信号。 NoDisplay=true、Unknown referenced nature、cannot find -lXxx、NPE 里的工具链 ID——这些词直接指向根因。
  3. 换环境 = 检查环境依赖。 新装的系统、新装的软件,最常缺的就是”环境能力”:缺插件、缺库、缺定义。
  4. 删除前先验证。 清理磁盘、删源码、删注册记录,都先备份或对比,避免误伤。
  5. 善用对比。 新旧版本对比插件列表、对比配置文件,往往一眼看出缺了什么。

嵌入式开发的环境,踩坑是常态。把这些坑记下来,下次遇到类似的,就能更快定位了。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Ubuntu 下嵌入式开发环境排障实录:应用菜单、图标、Eclipse 交叉编译
https://blog.xuefei.art/posts/ubuntu-embedded-dev-env-troubleshooting/
作者
雪飞
发布于
2026-09-01
许可协议
CC BY-NC-SA 4.0

文章目录