如何详细学习Linux通用软件包AppImage的打包过程?
摘要:近水楼台先得月,向阳花木易为春。 导航 格式介绍 - AppImage 手动打包 - appimagetool 自动打包 - linuxdeploy 杂七杂八 格式介绍 - AppImage AppImage 是 Linux 系统中一种新型
近水楼台先得月,向阳花木易为春。
导航
格式介绍 - 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。
