linuxdeployqt 工具的编译和使用
第二种,如果有多个可执行文件依赖这个库,需要拷贝多份,问题在于,比如说,这个库用来操作数据库多个库就会对应多个数据库,但是实际需要的是同一个数据库。然后我遇到的问题是,我的程序生成了一个可执行文件,和多个库,可执行文件依赖这些库。linuxdeployqt,这个工具的主要原理就是 利用 ldd 找到程序运行所需要的库, 拷贝到 lib,然后把可执行文件的依赖 通过 pat。在这里,是比较 glcv
直接使用 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 文件夹里
两种各有优劣,第一种的话,自己的库和可执行文件的依赖可能重复,浪费空间。第二种,如果有多个可执行文件依赖这个库,需要拷贝多份,问题在于,比如说,这个库用来操作数据库多个库就会对应多个数据库,但是实际需要的是同一个数据库。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)