习惯性地更新了Archlinux所有软件包,发现Navicat无法运行了。命令行运行报错如下:

symbol lookup error: /usr/lib/libgio-2.0.so.0: undefined symbol: g_module_open_full

网上查到libgio-2.0.so.0glib2包的文件,显然是版本不兼容了。考虑到AppImage本质上就是把各依赖库打包起来做成了便携应用,便考虑把老版本的glib2打包进应用镜像,结果完美解决。

把glib2 2.68.4打包到应用镜像里

这是我在Archlinux论坛的回复,懒得翻译了,内容如下。

Solution: Patch glib2 version 2.68.4 into appimage

Steps:

  1. Extract appimage file. All files will be in a directory called squashfs-root

    your-path/navicat15-premium-en.AppImage --appimage-extract
    

    Tips: When extracting ends in error as follow, you can try to mount appimage file then copy app source to directory squashfs-root.

    ./navicat15-premium-en.AppImage –appimage-extract qt.qpa.xcb: QXcbConnection: XCB error: 3 (BadWindow), sequence: 471, resource id: 12928710, major code: 40 (TranslateCoords), minor code: 0 /tmp/.mount_whnQrp/AppRun: symbol lookup error: /usr/lib/libgio-2.0.so.0: undefined symbol: g_module_open_full

    # create app source mount point
    mkdir src
    # mount appimage file(read only)
    sudo mount -o loop your-path/navicat15-premium-en.AppImage src
    # copy all source file(writable)
    cp -r src squashfs-root
    # umount appimage file
    sudo umount src
    rmdir src
    
  2. Find your glib2-2.68.4-1-x86_64.pkg.tar.zst package file. If you are lucky enough, there will be one in path /var/cache/pacman/pkg/glib2-2.68.4-1-x86_64.pkg.tar.zst. Or download it from package repository. Or anywhere.

    https://archive.archlinux.org/packages/g/glib2/glib2-2.68.4-1-x86_64.pkg.tar.zst
    
  3. Extract glib2-2.68.4-1-x86_64.pkg.tar.zst to squashfs-root

    tar xvf glib2-2.68.4-1-x86_64.pkg.tar.zst -C squashfs-root
    
  4. Repack squashfs-root into appimage file

    appimagetool squashfs-root navicat15-premium-en-patched.AppImage
    
  5. no more steps, just run it

把libffi 3.3打包到应用镜像里

最近发现Navicat跟libffi也出现了版本兼容的问题,运行错误如下:

error while loading shared libraries: libffi.so.7: cannot open shared object file: No such file or directory

查询发现,近期3.4.2-4版本的libffi去除了包中的libffi.so.7文件,取而代之的是libffi.so.8。看来找到旧版本的libffi打包进去即可,或者安装aur的包libffi7退回旧版本(不知道会不会出现其他兼容性问题)。

分析了libffi7后,发现libffi.so.7libffi3.3版本中的文件。那么可以把libffi-3.3-4-x86_64.pkg.tar.zst打包进应用镜像就好了。具体过程同glib2

https://archive.archlinux.org/packages/l/libffi/libffi-3.3-4-x86_64.pkg.tar.zst

奇怪的是,原应用镜像里自带了libffi6,不知道为何不能使用。

glibc不兼容问题

提示找不到共享库libcrypt.so.1文件。这是glibc里的文件,2.35-2版本移除了该文件。可以参考以上步骤,将glibc-2.35-1-x86_64.pkg.tar.zst打包到应用镜像里。

https://archive.archlinux.org/packages/g/glibc/glibc-2.35-1-x86_64.pkg.tar.zst

参考文章