[https://blog.csdn.net/u014746574/article/details/79288727] 原文基础补充修改而来
linux qt 程序打包发布
1.linuxdeployqt 安装
最简单的方法直接下载编译好的 linuxdeployqt-x86_64.AppImage文件,将其改名字为linuxdeployqt,并chmod a+x,然后复制到 /usr/local/bin/。然后命令行输入 linuxdelpoyqt –version,输出linuxdeployqt 版本就安装成功。
linuxdeployqt-x86_64.AppImage 下载地址,https://github.com/probonopd/linuxdeployqt/releases
点击linuxdeployqt-x86_64.AppImage右键下载即可。
$ mv linuxdeployqt-x86_64.AppImage linuxdeployqt
$ mv ./linuxdeployqt /usr/local/bin
$ linuxdelpoyqt --version
linuxdeployqt 4 (commit 988d294), build 481 built on 2018-02-02 15:05:23 UTC
2.打包自己的程序
将自己的qt程序(如myQtApp)复制到一个目录(如 qtTest),运行
注:在默认qt输出路径执行似乎有问题,最好先拷贝一下
$ linuxdeployqt ./myQtApp -appimage
遇到报错
ubuser@ubuntu:~/Desktop/myzr/build-cangaroo-Desktop_Qt_5_12_8_GCC_64bit-Release/bin$ linuxdeployqt ./cangaroo -appimage
linuxdeployqt 6 (commit d41e234), build 724 built on 2020-07-31 15:51:47 UTC
FHS-like mode with PREFIX, fhsPrefix: "/home/ubuser/Desktop/myzr/build-cangaroo-Desktop_Qt_5_12_8_GCC_64bit-Release"
app-binary: "/home/ubuser/Desktop/myzr/build-cangaroo-Desktop_Qt_5_12_8_GCC_64bit-Release/bin/cangaroo"
appDirPath: "/home/ubuser/Desktop/myzr"
relativeBinPath: "build-cangaroo-Desktop_Qt_5_12_8_GCC_64bit-Release/bin/cangaroo"
ERROR: "/usr/bin/qmake -query" exited with 1 : "qmake: could not exec '/usr/lib/x86_64-linux-gnu/qt4/bin/qmake': No such file or directory\n"
ERROR: Qt path could not be determined from qmake on the $PATH
ERROR: Make sure you have the correct Qt on your $PATH
ERROR: You can check this with qmake -v
这是因为默认的qt路径和qmake的版本不对,(我的电脑默认装了qt4,我的应用程序是qt5编译的)
需要修改qt版本:
sudo gedit /usr/lib/x86_64-linux-gnu/qt-default/qtchooser/default.conf
原来是:
/usr/lib/x86_64-linux-gnu/qt/bin
/usr/lib/x86_64-linux-gnu/
修改为用的qt版本路径:
/home/ubuser/Qt5.12.8/5.12.8/gcc_64/bin
/usr/lib/x86_64-linux-gnu/
可以通过 qmake -version确认版本是否正确切换
$ qmake -version
QMake version 3.0
Using Qt version 5.5.1 in /usr/lib/x86_64-linux-gnu
3.在ubuntu 中添加qt 应用程序图标
修改qt 目录下的desktop 文件。可以按照ubuntu 官方提示修改。
ubuntu desktop文件使用
#-- 全局安装(所有用户可用),将xxx.desktop 复制到/usr/share/applications
#-- 当前用户可用, 将xxx.desktop 复制到 ~/.local/share/applications 目录即可
#--appName.desktop
[Desktop Entry]
Version=1.0 #app的版本
Name=myQtApp #app的名字
Comment= this app use for xxx #说明信息
Exec=/path/to/your/QtApp/myQtApp #app的执行路径,绝对路径
Icon=/path/to/your/app_icon/myQtApp.png #icon 路径,绝对路径
Terminal=false #是否在终端启动,效果自己试一下就知道了
Type=Application
Categories=Utility;Application;
4、关于qt.conf
这个文件指定了qt 程序的运行环境。
引用qt说明的原话:
The qt.conf file can be used to override the hard-coded paths that are compiled into the Qt library. These paths are accessible using the QLibraryInfo class. Without qt.conf, the functions in QLibraryInfo return these hard-coded paths; otherwise they return the paths as specified in qt.conf.
即我们可以使用qt.conf 指定qt程序的运行路径和库路径。
The file should have a Paths group which contains the entries that correspond to each value of the QLibraryInfo::LibraryLocation enum. See the QLibraryInfo documentation for details on the meaning of the various locations.
这个文件应该要包含QLibraryInfo::LibraryLocation enum,如以下内容
Entry | Default Value |
---|---|
Prefix | 程序运行的路径,一下所有的路劲都是相对于这个路径 |
Libraries | 程序的库库路劲,linuxdeployqt会自动再这个目录生成./lib,并将需要的库拷贝过来 |
… | … |
主要有这几个,多余的可以上qt帮助文档
# Generated by linuxdeployqt
# https://github.com/probonopd/linuxdeployqt/
[Paths]
Prefix = ./ #程序的运行路劲
Libraries = ./lib #程序的库路径
Plugins = ./plugins #插件路径
参考:http://doc.qt.io/qt-5/qt-conf.html
5.补充
虽然linuxdepoyqt可以帮我们解决多数情况下库的依赖问题,但是也有的时候不能完整解决。这个时候就需要我们自己复制所依赖的库。
提供一个脚本,复制依赖库,复制以下代码,将其保存成为 copylib.sh
#!/bin/sh
bin=$1 #发布的程序名称
desDir="./lib" #你的路径
if [ ! -d $desDir ];then
#echo "makedir $desDir"
mkdir $desDir
fi
libList=$(ldd $bin | awk '{if (match($3,"/")){ printf("%s "),$3 } }')
cp $libList $desDir
命令行 运行
chmod a+x ./copylib.sh
./copylib.sh ./myapp
就可以复制所需要的库到当前目录下的 ./lib 文件夹中
通常情况下,结合linuxdelpoy 和 copylib.sh 可以解决Linux 下 qt 程序的库依赖问题