一、创建AppImage – 可执行文件

1.介绍

AppImage是一种可执行文件格式,可以在任意发行版的Linux操作系统上运行,比如Ubuntu, Debian, openSUSE, RHEL, CentOS, Fedora等。其原理是将可执行文件和依赖库打包为一个可执行文件。

详细介绍: AppImages官方文档

2. 下载制作工具-linuxdeploy

原地址:

wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage

镜像地址:

wget https://github.91chi.fun/https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage

下载后,添加执行权限:

sudo chmod +x linuxdeploy-x86_64.AppImage

3. 准备工作

制作AppImage文件需要一个.desktop文件和icon图标。

1. .desktop桌面文件

[Desktop Entry]
Name=HelloApp
Type=Application
Terminal=true
NoDisplay=true
Exec=hello
Icon=hello
Categories=Development;

需要修改项:

  • Name: 生成的程序文件名称
  • Terminal:如果为命令行程序则为true,如果为GUI则为false
  • Exec:可执行文件名
  • Icon:图标文件名,不包含后缀

详细见官方说明:desktop-entry-spec

2. icon图标

linuxdeploy官方示例图标:

4. 制作Hello.AppImage程序

hello程序依赖于glib2.0库,执行后打印出Hello world字符串。
当前目录结构:

.
├── hello
├── hello.desktop
├── hello.png
└── linuxdeploy-x86_64.AppImage
  • hello: 可执行程序,依赖glib2.0库
  • hello.desktop:桌面文件
  • hello.png:图标文件

1. 自动分析依赖

这种情况下程序可以在本机正常运行,所依赖的库都已经安装,那么linuxdeploy可以自动分析依赖库,并打包为AppImage程序。
执行命令:

./linuxdeploy-x86_64.AppImage  --appdir appdir -e ./hello -d ./hello.desktop -i ./hello.png --output appimage
  • –appdir: 指定打包的临时目录名称
  • -e: 指定要打包的可执行程序
  • -d: 桌面文件
  • -i: 图标文件
  • –output: 输出目标格式,固定为appimage

完成后会生成HelloApp-x86_64.AppImage,即目标AppImage文件。

此时目录结构如下:

.
├── appdir
│   ├── AppRun -> usr/bin/hello
│   ├── hello.desktop -> usr/share/applications/hello.desktop
│   ├── hello.png -> usr/share/icons/hicolor/64x64/apps/hello.png
│   └── usr
│       ├── bin
│       │   └── hello
│       ├── lib
│       │   ├── libglib-2.0.so.0
│       │   └── libpcre.so.3
│       └── share
│           ├── applications
│           │   └── hello.desktop
│           ├── doc
│           │   └── libglib2.0-0
│           │       └── copyright
│           └── icons
│               └── hicolor
│                   ├── 128x128
│                   │   └── apps
│                   ├── 16x16
│                   │   └── apps
│                   ├── 256x256
│                   │   └── apps
│                   ├── 32x32
│                   │   └── apps
│                   ├── 64x64
│                   │   └── apps
│                   │       └── hello.png
│                   └── scalable
│                       └── apps
├── hello
├── HelloApp-x86_64.AppImage
├── hello.desktop
├── hello.png
└── linuxdeploy-x86_64.AppImage

可以看到打包的临时目录appdir下会把程序依赖库打包进去。

2.手动添加依赖

  1. 生成打包临时目录
 ./linuxdeploy-x86_64.AppImage --appdir appdir -d hello.desktop -i hello.png

此时目录结构:

appdir/
├── hello.desktop -> usr/share/applications/hello.desktop
├── hello.png -> usr/share/icons/hicolor/64x64/apps/hello.png
└── usr
    ├── bin
    ├── lib
    └── share
        ├── applications
        │   └── hello.desktop
        └── icons
            └── hicolor
                ├── 128x128
                │   └── apps
                ├── 16x16
                │   └── apps
                ├── 256x256
                │   └── apps
                ├── 32x32
                │   └── apps
                ├── 64x64
                │   └── apps
                │       └── hello.png
                └── scalable
                    └── apps
  1. 分析程序依赖
    执行命令,查看库依赖项:
$ ldd hello
    linux-vdso.so.1 (0x00007ffebc5fc000)
    libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f5906d45000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5906b53000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f5906ae0000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f5906abd000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f5906e7e000)
  1. 将可执行程序及依赖的第三方库复制到打包对应的目录下
    c库及系统库可以不用复制

  2. 生成AppImage

./linuxdeploy-x86_64.AppImage --appdir appdir -d hello.desktop -i hello.png --output appimage

Ref

  1. linuxdeploy
  2. packaging-guide