直接使用 linuxdeployqt 提示系统版本过高,所以自己下载源码编译了一下,在此记录下遇到的问题。

1. 打开 linuxdeployqt/tools/linuxdeployqt/CmakeLists.txt 进行编译

源码里包含很多内容,我们只需要 tools 这个

2.


编译报错 提示没有 cmake_minimum_required 这句,根据提示加上

到了这步,编译应该就可以通过了

然后开始打包,提示系统版本太新

 在这里,是比较 glcv 的版本,不知道版本过高会怎么样,注释,重新编译(注释掉,编译,打包后面也成功了)

运行可能会提示 patchelf appimagetool 找不到

sudo apt-get install patchelf

https://github.com/AppImage/AppImageKit/releases/latest/download/appimagetool-x86_64.AppImage

chmod +x appimagetool-x86_64.AppImage

sudo mv appimagetool-x86_64.AppImage /usr/local/bin/appimagetool

再次运行,出现错误,git 那个不用管,然后下面那个提示是说 default.desktop 缺少 Categories=key 这句。default.desktop 文件是 Linux 系统中用于描述应用程序启动项的桌面条目文件,Categories 字段用于指定应用程序所属的类别。常见类型有这些,可以有多种类型。

Audio 音频相关应用,如音乐播放器
Video 视频相关应用,如视频播放器
Graphics 图形处理应用,如图像编辑器
Network 网络相关应用,如浏览器、FTP 客户端
Office 办公应用,如文字处理器、电子表格软件
Game 游戏应用
Utility 实用工具,如系统监控工具、文件管理器

default.desktop最后加上这句 Categories=Office

再次执行 linuxdeployqt {your_appname} -appimage 应该就能成功了。

另外,在 /linuxdeployqt/tools/linuxdeployqt/excludelist.h 这个文件里会列出一些库,拷贝时不会把这些库拷贝进去,没有明白为什么排查这些库。

 

我这边有个库拷贝进去了,也执行了 --set-rpath 但是 程序依赖的这个库还是在系统路径,把 --set-rpath 改为 --force-rath --set-rpath 后可以

此外,我还有遇到一个问题,也在此说明一下:

在打包成功后,运行 AppRun 提示有库找不到。

先回到 linuxdeployqt,这个工具的主要原理就是 利用 ldd 找到程序运行所需要的库, 拷贝到 lib,然后把可执行文件的依赖 通过 patchelf --set-rpath 指向 lib 文件夹,再通过 appimagetool 生成 .AppImage 文件。在这个过程中,如果 ldd 找到的库在打包的目录里,不会进行拷贝。

然后我遇到的问题是,我的程序生成了一个可执行文件,和多个库,可执行文件依赖这些库。当ldd 会把 我生成的库的依赖拷贝进去 lib 里。这个导致的结果是,我生成的库依赖没有指向 lib,导致库找不到。

所有有两种方案处理  1.把生成库的依赖先处理好 2.直接把自己生成的库拷贝到 lib 文件夹里

两种各有优劣,第一种的话,自己的库和可执行文件的依赖可能重复,浪费空间。第二种,如果有多个可执行文件依赖这个库,需要拷贝多份,问题在于,比如说,这个库用来操作数据库多个库就会对应多个数据库,但是实际需要的是同一个数据库。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐