Linux/Ubuntu arm64下使用linuxdeployqt打包Qt程序
1、前言
因为项目需要,需要在ubuntu arm64环境下打包一个Qt程序,考虑到后续可能多次使用到,在此进行记录。
2、环境
①Linux aarch64 GNU/Linux
②Qt 5.12.8
③GCC/G++ 9.4.0
④Git 2.25.1
3、准备
1、下载Linuxdeployqt源码
使用Git命令下载linuxdeployqt源码
git clone https://github.com/probonopd/linuxdeployqt.git
或者直接进入github下载源码
Linuxdeployqt的Github页面https://github.com/probonopd/linuxdeployqt/tree/master
2、下载Appimagetool-aarch64.AppImage
进入linuxdeployqt源码文件夹的DUILDING.md文件中给出的Appimagetool下载路径https://github.com/AppImage/AppImageKit/releases,下载Appimagetool-aarch64.AppImage
4、编译linuxdeployqt
1.配置环境变量
在终端窗口输入命令行
vim ~/.bashrc
在打开文件的结尾追加以下内容
#add qt env
export PATH=/opt/Qt5.13.0/5.13.0/gcc_64/bin:$PATH
export LIB_PATH=/opt/Qt5.13.0/5.13.0/gcc_64/lib:$LIB_PATH
export PLUGIN_PATH=/opt/Qt5.13.0/5.13.0/gcc_64/plugins:$PLUGIN_PATH
export QML2_PATH=/opt/Qt5.13.0/5.13.0/gcc_64/qml:$QML2_PATH
注:/opt/Qt5.13.0/5.13.0/gcc_64是本电脑Qt安装目录,不同电脑安装不一定相同,需要根据自己的情况替换。
然后,使用source命令让文件立即生效。
source ~/.bashrc
然后,通过qmake命令对环境变量测试下,是否设置正确。如下:
qmake -v
看到qmake的版本号,则表示设置成功。
2.编译linuxdeployqt
进入linuxdeployqt源码所在文件夹
cd linuxdeployqt
使用qmake与make命令在linuxdeployqt文件夹下编译
qmake
make
编译完成后,会在linuxdeployqt源码文件夹下生成bin文件夹,在bin文件夹下将会有linuxdeployqt可执行程序(以下图片仅为示意)
修改linuxdeployqt可执行程序的权限
sudo chmod 777 linuxdeployqt
为了使用方便,将linuxdeployqt可执行程序复制到/usr/local/bin文件夹下,这样就可以在其他目录中使用linuxdeployqt了
sudo mv linuxdeployqt /usr/local/bin
在任一其他目录中打开终端窗口,使用一下命令查看是否成功
linuxdeployqt --version
出现linuxdeployqt的版本信息,就为成功
5、安装patchelf
sudo apt update
sudo apt install patchelf
如果不安装patchelf,在打包时可能会出现如下图等错误
可以通过一下命令查看patchelf是否安装成功
patchelf --version
出现版本号即为安装成功
6、配置Appimagetool
将准备时下载的Appimagetool-aarch64.AppImage程序改名为appimagetool,并修改权限
mv appimagetool-aarch64.AppImage appimagetool
sudo chmod 777 appimagetool
将appimagetool同样移动到/usr/local/bin目录下
sudo mv appimagetool /usr/local/bin
7、打包Qt程序
将生成的Release版本的可执行程序拷贝到单独的文件夹中
例子:在某个目录建立TestSetup目录,用于放置打包相关的文件;并在TestSetup下继续建个Test目录,用来装Test应用及拷贝文件。
mkdir TestSetup
cd TestSetup
mkdir Test
把我们的应用Test拷贝到Test目录下
使用命令执行依赖文件拷贝(打包):
linuxdeployqt Test -appimage
如没有Desktop,Icon的Error信息以外的错误出现,即为打包成功,如下图
等待打包完成后,即可在文件夹下查看到lib,plugins等文件夹
注:需要说明的是,在执行“linuxdeployqt Test -appimage”命令时,其实除了拷贝依赖文件外,还对目标文件Test进行了修改,在Test中插入了一些库路径信息。
经过其他大佬对前后2个文件内容的对比测试,至少是添加了lib目录的。
所以,你只需要把程序依赖的so文件放入lib目录下,无论是显式、隐式加载的so,都是可以搜索到的。
若你的应用中还有其他,如配置文件等资源,那么手动拷贝到你自己代码指定的目录下。
重要提示:
- 因为linuxdeployqt将在内部使用ldd命令,来确定从何处将库复制到包中。ldd命令本身只能查找隐式加载的so,故若程序中代码使用显式加载的so,它是找不到的,这时需要开发者自己去保证显式加载so的路径可被搜索。
- 举个例子:若存在程序A显式加载B.so,B.so隐式加载C.so,则对程序A使用linuxdeployqt拷贝依赖时,程序A的间接依赖文件C.so,将不会被拷贝。当程序跑起来加载B.so时,就会报找不到C.so的错误。这一点尤其需要注意。此时我们需要再对B.so使用一次linuxdeployqt拷贝依赖。这样程序A加载B.so,B.so加载C.so,就都可以找到了。
测试启动应用
./Test
此时如果不出意外,应该可以正常启动。
如果有意外,那就根据实际情况,先把问题解决,再继续。
8、其他
如果在x86_64架构下的linux/ubuntu系统,可以尝试直接从github中下载
Linuxdeployqt的Github的Release下载页面https://github.com/probonopd/linuxdeployqt/releases/tag/continuous
下载完成后,使用命令设置权限与重命名,并移动到/usr/local/bin目录下
mv linuxdeployqt-continues-x86_64.AppImage linuxdeployqt
sudo chmod 777 linuxdeployqt
sudo mv appimagetool /usr/local/bin
之后就可以通过步骤7打包Qt程序了
最后
通过网上查阅资料,最后完成ubuntu arm架构下Qt程序的打包,感谢几位大佬提供的资料
使用linuxdeployqt在linux下进行Qt打包发布(超详细)-CSDN博客
使用linuxdeployqt在linux下进行Qt打包发布 (超详细) (*****)-CSDN博客
Ubuntu 编译 linuxdeployqt_ubuntu20.04 编译linuxdeployqt-CSDN博客
以上仅为本人在参考多位大佬的文章进行linuxdeployqt的使用过程分享,如有错漏,还望指正