news 2026/9/5 21:10:53

AppImage 打包详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AppImage 打包详解

近水楼台先得月,向阳花木易为春。

导航

  • 格式介绍 - AppImage
  • 手动打包 - appimagetool
  • 自动打包 - linuxdeploy
  • 杂七杂八

格式介绍 - AppImage

AppImage 是 Linux 系统中一种新型的软件包格式,它与 rpm、deb 这些软件包格式相比最大的不同便是:(1)无需安装,即用即删。(2)只需打包一次,便可到处运行。完美的解决了不同 Linux 发行版(Ubuntu/Debian/Fedora/CentOS)之间软件包不统一的问题。

它的工作原理便是将程序运行所需的文件全部打包在一个文件中,待程序运行时再将这些文件提取在/tmp/.mount_xxxxxxx/目录中,然后执行 AppRun 脚本启动程序以进行资源的调用。以下便是一个 AppImage 文件内部包含的目录树结构:

AppDir/ ├── AppRun ├── 应用图标.png ├── 程序名.desktop ├── usr/ ├── bin/ ├── lib/ ├── share/

它本质上就是一个squashfs 文件系统 + runtime 执行器

特别注意:

(1)要实现跨平台运行,待打包的程序最好是在 CentOS 7 系统上进行编译,然后再进行打包。【注:编译 C/C++ 程序所使用的系统库 glibc 在 Linux 系统上几乎肯定存在,而该库有着良好的向后兼容性,因此使用旧版本的 glibc 库编译出来的程序几乎可以完美的运行在新版本的 glibc 系统上。而在 CentOS 7 上的 glibc 版本是 2.17,该版本较旧且兼容性较好,因此在其系统上编译出来的 C 程序通常也可以在大部分的 Linux 发行版系统中使用。】

(2)待打包程序依赖的 lib 文件中最好只包含其专属的库文件即可,不要包含类似 glibc 这样的系统库文件。【注:这是因为在 A 系统中的 glibc 文件通常并不可以在 B 系统中使用,因此为了避免 AppImage 程序运行错误,请勿这样去做。再者,glibc 在 Linux 系统中是肯定会存在的,因此也并不需要额外去包含这样的依赖文件。】

手动打包 - appimagetool

appimagetool 是由 AppImage 官方制作的打包工具,在使用它进行打包时,必须要先分析待打包程序的动态库依赖情况,然后再完成对 AppDir 目录的装填,最后才能使用 appimagetool 完成对程序的打包。由于分析程序的依赖情况是个很复杂的问题,因此该工具在使用上体验并不太好。

接下来,我将演示如何对一个简单的 C 程序完成打包过程:

(1)文件准备:hello.c。

// 主文件 hello.c#include<stdio.h>intmain(){printf("Hello Appimage\n");return0;}

(2)编译并打包

#(1)编译及检验运行gcc-ohello hello.c ./hello#(2)制作 AppDir 目录树mkdir-pAppDir/usr/bin/cp./hello AppDir/usr/bin/wgethttps://github.com/boolean-world/appimage-resources/blob/master/hello-world-appimage/hello-world-icon.png-OAppDir/hello.png#任意图片文件即可nanoAppDir/hello.desktop#文件内容见下方nanoAppDir/AppRun#脚本内容见下方#(3)开始制作 AppImage 程序/root/appimagetool-x86_64.AppImage AppDir/

附注:

hello.desktop 文件如下:

[Desktop Entry] Name=hello Exec=hello Icon=hello Type=Application Categories=Utility; Terminal=true

AppRun 脚本如下:

#!/bin/shAPPDIR="$(dirname "$(readlink-f"$0")")" # 添加库目录 if [ -d "$APPDIR/lib64" ]; then export LD_LIBRARY_PATH="$APPDIR/lib64:$LD_LIBRARY_PATH" fi if [ -d "$APPDIR/usr/lib" ]; then export LD_LIBRARY_PATH="$APPDIR/usr/lib:$LD_LIBRARY_PATH" fi # 启动主程序 //注意:不同应用主程序路径需要修改 exec "$APPDIR/usr/bin/hello" "$@"

AppDir 目录树结构如下:

AppDir/ ├── AppRun //启动程序,可以是简单的脚本,也可以是 ELF,只要保证运行该脚本主程序能被启动即可。 ├── hello.desktop //注意 EXEC 的值,它对应的是/usr/bin/目录中的程序,而 Icon 对应的是当前目录 ├── hello.png //也支持 svg 格式 └── usr └── bin └── hello

自动打包 - linuxdeploy

linuxdeploy 是一个由第三方制作的 AppImage 打包工具,与 appimagetool 不同的是,它可以对待打包程序自动进行依赖分析,并自动将所需的依赖及资源文件按照 AppDir 的目录格式给装填完毕,用户只需将模版化的 desktop 文件和 icon 文件准备好即可,使用起来简直美滋滋。

【示例一】:接下来,我将演示如何对一个需要依赖的简单 C 程序完成打包过程:

(1)文件准备:mylib.h、mylib.c、main.c、Makefile。

// 动态库头文件 mylib.h#ifndefMYLIB_H#defineMYLIB_Hintadd(inta,intb);voidhello();#endif
// 动态库源码 mylib.c#include<stdio.h>#include"mylib.h"intadd(inta,intb){returna+b;}voidhello(){printf("Hello from my dynamic library!\n");}
// 主程序 main.c#include<stdio.h>#include"mylib.h"intmain(){hello();intresult=add(3,5);printf("3 + 5 = %d\n",result);return0;}
# Makefile 文件 CC=gcc CFLAGS=-fPIC -Wall LDFLAGS=-shared TARGET_LIB=libmylib.so TARGET_MAIN=main all: $(TARGET_LIB) $(TARGET_MAIN) $(TARGET_LIB): mylib.o $(CC) $(LDFLAGS) -o $(TARGET_LIB) mylib.o mylib.o: mylib.c mylib.h $(CC) $(CFLAGS) -c mylib.c $(TARGET_MAIN): main.o $(TARGET_LIB) $(CC) main.o -L. -lmylib -o $(TARGET_MAIN) main.o: main.c mylib.h $(CC) -c main.c clean: rm -f *.o $(TARGET_MAIN) $(TARGET_LIB)

(2)编译并打包

#(1)编译及检验运行cdmyappmakemvlibmylib.so /lib64/libmylib.so ./main#(2)制作的 main.desktop 文件内容catmain.desktop[Desktop Entry]Name=mainExec=mainIcon=mainType=ApplicationCategories=Utility;Terminal=true#(3)获取一个 Icon 文件wgethttps://github.com/boolean-world/appimage-resources/blob/master/hello-world-appimage/hello-world-icon.png-Omain.png#(4)开始制作 AppImage 程序/root/linuxdeploy-x86_64.AppImage--appdir/root/myapp--outputappimage --icon-file main.png --desktop-file main.desktop-emainls-lmain*.AppImage

【示例二】:最后,我再演示如何对一个系统命令 find 完成打包过程:

#(1)制作的 find.desktop 文件内容catfind.desktop[Desktop Entry]Name=findExec=findIcon=findType=ApplicationCategories=Utility;Terminal=true#(2)获取一个 Icon 文件wgethttps://github.com/boolean-world/appimage-resources/blob/master/hello-world-appimage/hello-world-icon.png-Ofind.png#(3)开始制作 AppImage 程序cd$(dirname$(whichfind))/root/linuxdeploy-x86_64.AppImage--appdir/root/find--outputappimage --icon-file find.png --desktop-file find.desktop-efindls-lfind*.AppImage

注意:(1)建议将 icon 和 desktop 文件放置在 find 命令根目录下,这样在打包的时候能够避免很多问题。(2)由于 linuxdeploy 在打包环节调用的是 appimagetool,而 appimagetool 在打包的时候会在 github 上拉取 runtime 文件,因此在使用前建议设置全局代理以确保 github 可访问。

杂七杂八

  1. AppImage 参考:官网、参考文档、软件分发
  2. linuxdeploy 插件系统:awesome-linuxdeploy,插件 linuxdeploy-plugin-checkrt 在打包较复杂的 C 程序时可能会比较有用。
  3. 理想的编译环境:CentOS 7 x64、CentOS 6 x32。【注意:64 位系统打包出的 AppImage 不可在 32 位系统使用。 】
  4. pkg2appimage 工具支持将 deb 软件包转换给 AppImage 格式的软件包。【注:理论是美好的,但实际打包时失败率太高且太折腾,不推荐使用,还是老实用 linuxdeploy 吧。】
  5. 已打包的 AppImage 软件包,可通过./app*.AppImage --appimage-extract将其包含的文件重新提取出来,以供参考或重复打包。
我的博客园
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 21:10:27

Java(AI)岗面试高频考点:八股文、场景题与项目面复习指南

金九银十的招聘节奏&#xff0c;对 Java(AI) 岗的候选人是一次阶段性压力测试。打开面试清单&#xff0c;Java 基础、并发编程、JVM、MySQL、Spring 几乎必考&#xff0c;最近还叠加了 Spring AI、大模型应用、AI Agent 这类新方向。很多候选人八股文背得熟&#xff0c;但面试官…

作者头像 李华
网站建设 2026/9/2 9:24:18

从“快乐马”到技术系统:用Python实现弹幕热点突增检测与推送

你如果刷到过这个标题&#xff0c;大概率会先愣一下&#xff1a;B站错过的“快乐马”是什么&#xff1f;“腾讯”旁边为什么还带着引号&#xff1f;曾爱玲又是谁&#xff1f;这个词组看起来像一条娱乐八卦&#xff0c;又像某个网络事件&#xff0c;实际上却是典型的“信息噪声”…

作者头像 李华
网站建设 2026/9/2 7:20:35

软件升级秒变窃钞后门,金融黑客跨国洗劫数亿资金全记录

最新内容 微 信 搜索 公 众 号 网 络 研 究 观 在数字经济高度发达的今天&#xff0c;你存放在银行里的钱真的万无一失吗&#xff1f;最近&#xff0c;欧洲与拉美警方联合破获的一起特大跨国金融网络诈骗案&#xff0c;揭开了软件供应链安全缺陷所引发的灾难性后果。一个看似微…

作者头像 李华
网站建设 2026/9/2 10:32:43

2026 AI编程新趋势:为什么高手开始关注Codex任务管理能力

随着 AI 编程工具快速发展&#xff0c;ChatGPT、Codex 等工具已经逐渐进入软件开发流程。从最初的代码补全、错误解释&#xff0c;到现在能够理解项目结构、分析代码关系、辅助完成复杂开发任务&#xff0c;AI 编程正在发生新的变化。很多开发者过去关注的问题是&#xff1a;如…

作者头像 李华
网站建设 2026/9/2 8:47:07

CSP-J 2023 小苹果

题意理解 n个苹果从左到右排成一列。每天操作&#xff1a;从第 1 个开始&#xff0c;每隔 2 个拿走 1 个。剩下苹果保持原顺序重新排成新序列。 问两个值&#xff1a; 一共多少天拿完全部苹果。原始编号为n的苹果&#xff0c;会在第几天被拿走。 代码拆分 整个代码可以分为两个…

作者头像 李华
网站建设 2026/9/1 12:34:50

零基础学Python:从环境搭建到爬虫与数据分析实战

关于 Python 学习&#xff0c;网上最不缺的就是资料&#xff0c;但最缺的是一条清晰的路线。很多零基础的读者下载了 Python、收藏了一堆教程&#xff0c;结果今天看变量、明天看函数&#xff0c;后天又跑去学 Django&#xff0c;来回横跳了大半个月&#xff0c;连一个完整的爬…

作者头像 李华