以前写得一个Qt程序,移植Windows下的一个名字叫sscom的串口助手到Linux下了。如今大多数软件都使用了AppImage来打包成单体App,我也来实践一下。

pkg2appimage

教程在这里,使用体验不佳。

appimage-builder

教程在这里,使用体验不佳。

linuxdeployqt(推荐)

https://github.com/probonopd/linuxdeployqt

安装linuxdeployqt

sudo wget https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage /usr/local/bin/linuxdeployqt && sudo chmod +x /usr/local/bin/linuxdeployqt

新建目录

mkdir sscom && cd sscom
mkdir -p AppDir/usr/bin/
mkdir -p AppDir/usr/lib/
mkdir -p AppDir/usr/share/applications

开始打包

cp sscom AppDir/usr/bin/sscom
cp sscom.desktop AppDir/usr/share/applications
linuxdeployqt AppDir/usr/share/applications/sscom.desktop -appimage

完整日志

$ linuxdeployqt AppDir/usr/share/applications/sscom.desktop -appimage

输出内容:

linuxdeployqt 7 (commit b469748), build 734 built on 2021-06-13 13:17:57 UTC
Desktop file as first argument: "AppDir/usr/share/applications/sscom.desktop"
desktopExecEntry: "sscom"
desktopIconEntry: "sscom"
Found binary from desktop file: "/tmp/sscom/AppDir/usr/bin/sscom"
FHS-like mode with PREFIX, fhsPrefix: "/tmp/sscom/AppDir/usr"
app-binary: "/tmp/sscom/AppDir/usr/bin/sscom"
appDirPath: "/tmp/sscom/AppDir"
relativeBinPath: "usr/bin/sscom"
Keeping existing AppRun
Copied "AppDir/usr/share/applications/sscom.desktop" to "/tmp/sscom/AppDir/sscom.desktop"
Found icons from desktop file: ("/tmp/sscom/AppDir/usr/share/icons/hicolor/256x256/apps/sscom.png")
iconToBeUsed: "/tmp/sscom/AppDir/usr/share/icons/hicolor/256x256/apps/sscom.png"
Copied "/tmp/sscom/AppDir/usr/share/icons/hicolor/256x256/apps/sscom.png" to "/tmp/sscom/AppDir/sscom.png"
WARNING: Plugin "/usr/lib/x86_64-linux-gnu/qt5/plugins/platformthemes/libqgtk2.so" not found, skipping
WARNING: Plugin "/usr/lib/x86_64-linux-gnu/qt5/plugins/styles/libqgtk2style.so" not found, skipping
WARNING: "/tmp/sscom/AppDir/usr/bin/qt.conf" already exists, will not overwrite.
appimagetool, continuous build (commit 1681fd8), build <local dev build> built on 2021-06-09 06:11:53 UTC
fatal: not a git repository (or any of the parent directories): .git
Failed to run 'git rev-parse --short HEAD: Child process exited with code 128 (code 128)
Desktop file: /tmp/sscom/AppDir/sscom.desktop
Name: Amazing Qt App
Icon: sscom
Exec: sscom
Comment: The best Qt Application Ever
Type: Application
Categories: Office;
/tmp/sscom/AppDir/usr/lib/libxcb-render.so.0 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libQt5Network.so.5 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libudev.so.1 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libFcitxQt5DBusAddons.so.1 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libgraphite2.so.3 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libicui18n.so.60 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libxcb-xkb.so.1 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libxcb-shm.so.0 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libicudata.so.60 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/liblz4.so.1 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libXdmcp.so.6 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libQt5Svg.so.5 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libxkbcommon.so.0 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libxcb-icccm.so.4 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libxcb-shape.so.0 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libXi.so.6 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libxkbcommon-x11.so.0 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libdouble-conversion.so.1 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libgcrypt.so.20 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libXext.so.6 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libxcb-image.so.0 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libQt5XcbQpa.so.5 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libQt5DBus.so.5 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libxcb-render-util.so.0 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libjpeg.so.8 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libxcb-keysyms.so.1 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libQt5SerialPort.so.5 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libX11-xcb.so.1 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libdbus-1.so.3 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libxcb-util.so.1 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libpng16.so.16 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libpcre.so.3 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libsystemd.so.0 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libxcb-xinerama.so.0 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libxcb-sync.so.1 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libXau.so.6 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libQt5Widgets.so.5 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libxcb-glx.so.0 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libbsd.so.0 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libxcb-randr.so.0 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libicuuc.so.60 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/liblzma.so.5 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libxcb-xfixes.so.0 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libQt5Core.so.5 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/lib/libQt5Gui.so.5 used for determining architecture x86_64
/tmp/sscom/AppDir/usr/bin/sscom used for determining architecture x86_64
Using architecture x86_64
App name for filename: Amazing_Qt_App
/tmp/sscom/AppDir should be packaged as Amazing_Qt_App-x86_64.AppImage
Generating squashfs...
Size of the embedded runtime: 189632 bytes
mksquashfs commandline: /tmp/.mount_linuxdwDUFSp/usr/bin/../lib/appimagekit/mksquashfs /tmp/sscom/AppDir Amazing_Qt_App-x86_64.AppImage -offset 189632 -comp gzip -root-owned -noappend -mkfs-time 0 
Parallel mksquashfs: Using 6 processors
Creating 4.0 filesystem on Amazing_Qt_App-x86_64.AppImage, block size 131072.
[================================================================================================================================================================/] 620/620 100%

Exportable Squashfs 4.0 filesystem, gzip compressed, data block size 131072
	compressed data, compressed metadata, compressed fragments,
	compressed xattrs, compressed ids
	duplicates are removed
Filesystem size 24528.09 Kbytes (23.95 Mbytes)
	36.08% of uncompressed filesystem size (67974.06 Kbytes)
Inode table size 3493 bytes (3.41 Kbytes)
	42.02% of uncompressed inode table size (8313 bytes)
Directory table size 1879 bytes (1.83 Kbytes)
	40.84% of uncompressed directory table size (4601 bytes)
Number of duplicate files found 18
Number of inodes 193
Number of files 130
Number of fragments 26
Number of symbolic links  1
Number of device nodes 0
Number of fifo nodes 0
Number of socket nodes 0
Number of directories 62
Number of ids (unique uids + gids) 1
Number of uids 1
	root (0)
Number of gids 1
	root (0)
Embedding ELF...
Marking the AppImage as executable...
Embedding MD5 digest
Success

Please consider submitting your AppImage to AppImageHub, the crowd-sourced
central directory of available AppImages, by opening a pull request
at https://github.com/AppImage/appimage.github.io

$ ls -l
total 24724
-rwxr-xr-x 1 tony tony 25310400 11月 11 11:57 Amazing_Qt_App-x86_64.AppImage
drwxrwxr-x 3 tony tony     4096 11月 11 11:57 AppDi
$