方法一:
导入qt的环境变量:
#add qt 环境变量
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
export LD_LIBRARY_PATH=/opt/Qt5.13.0/5.13.0/gcc_64/lib:$LD_LIBRARY_PATH
推荐方法linuxdeployqt打包:使用linuxdeployqt在linux下进行Qt打包发布(超详细)_百里杨的博客-CSDN博客_linuxdeployqt打包
首先升级一下系统的gcc版本,默认cent7安装的版本为gcc版本为4.8,版本太低。按照网上的教程直接qmake、make会报错。升级教程:centos 7 升级gcc版本_这一切没有想象那么糟的博客-CSDN博客_centos7 gcc升级
linuxdeployqt运行时检测到我们的系统版本过高,不继续执行的问题,我们下载最新源码GitHub – probonopd/linuxdeployqt: Makes Linux applications self-contained by copying in the libraries and plugins that the application uses, and optionally generates an AppImage. Can be used for Qt and other applications,修改代码,将tools/linuxdeployqt/main.cpp中的下述代码注释掉:
// if (strverscmp (glcv, "2.27") >= 0) {
// qInfo() << "ERROR: The host system is too new.";
// qInfo() << "Please run on a system with a glibc version no newer than what comes with the oldest";
// qInfo() << "currently still-supported mainstream distribution (xenial), which is glibc 2.23.";
// qInfo() << "This is so that the resulting bundle will work on most still-supported Linux distributions.";
// qInfo() << "For more information, please see";
// qInfo() << "https://github.com/probonopd/linuxdeployqt/issues/340";
// return 1;
// }
然后重新编译生成
oot@ubuntu:~/CodeQT/linuxdeployqt# ls
BUILDING.md LICENSE.GPLv3 linuxdeployqt.pro sync.profile
CMakeLists.txt LICENSE.LGPLv3 README.md tests
Dockerfile linuxdeployqt.AppDir src tools
root@ubuntu:~/CodeQT/linuxdeployqt# qmake
Info: creating stash file /root/CodeQT/linuxdeployqt/.qmake.stash
Info: creating cache file /root/CodeQT/linuxdeployqt/.qmake.cache
root@ubuntu:~/CodeQT/linuxdeployqt# make
编译出来的源程序会放在./bin目录下,然后将生成的程序放到/usr/local/bin/目录下(为了方便)
root@ubuntu:~/CodeQT/linuxdeployqt# cd bin
root@ubuntu:~/CodeQT/linuxdeployqt/bin# ls
linuxdeployqt
root@ubuntu:~/CodeQT/linuxdeployqt/bin# mv linuxdeployqt /usr/local/bin/linuxdeployqt
命令:直接运行linuxdeployqt untitled 导出依赖报错。后面加上 -verbose2
注意:修改了代码,重新编译后,删除目录下的其他文件,重新执行下面命令。
linuxdeployqt (commit ), build <local dev build> built on 2021-04-01 06:38:59 UTC
FHS-like mode with PREFIX, fhsPrefix: “/../..”
QDir::exists: Empty or null file name
ERROR: Error: Could not find app-binary “”
linuxdeployqt untitled -verbose2
导出依赖编译缺少patchelf
ERROR: Could not start patchelf.
ERROR: Make sure it is installed on your $PATH.
ERROR: Error reading rpath with patchelf “libQt5Widgets.so” : “”
ERROR: Error reading rpath with patchelf “libQt5Widgets.so” : “”
root@ubuntu:/# apt install patchelf
centos7
[root@localhost]# yum install patchelf
编译缺少,提示没有libqgtk2.so和libqgtk2style.so这两个文件。:
WARNING: Plugin “/opt/Qt5.13.0/5.13.0/gcc_64/plugins/platformthemes/libqgtk2.so” not found, skipping
WARNING: Plugin “/opt/Qt5.13.0/5.13.0/gcc_64/plugins/styles/libqgtk2style.so” not found, skipping
apt-get update
apt-get -y install libgtk2.0-dev
git clone http://code.qt.io/qt/qtstyleplugins.git
cd qtstyleplugins
qmake
make -j$(nproc)
sudo make install
导出后,测试验证是否依赖全部导出,新开一个终端窗口,如下清空环境变量。后在此终端执行导出的程序是否正常运行。
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
export LIB_PATH=
export PLUGIN_PATH=
export QML2_PATH=
方法二:
1. QtCreate使用Release版本编译
将编译后生成的可执行程序(如:test)复制到一个空目录下
2.使用ldd命令查看和导出需要的库
在步骤1的目录下新建一个pack.sh文件,文件内容如下:
#!/bin/sh
exe="test" #你需要发布的程序名称
des="/home/someone/QtProject/build-test-Desktop-Release/Test" #步骤1中的目录即本文件所在目录
deplist=$(ldd $exe | awk '{if (match($3,"/")){ printf("%s "),$3 } }')
cp $deplist $des
文件中有两处中文注释的地方需要修
3.编写执行程序的sh文件
在此目录下再新建一个test.sh文件(文件名必须与可执行文件名字一样),
文件内容如下(不需要修改):
#!/bin/sh
appname=`basename $0 | sed s,\.sh$,,`
dirname=`dirname $0`
tmp="${dirname#?}"
if [ "${dirname%$tmp}" != "/" ]; then
dirname=$PWD/$dirname
fi
LD_LIBRARY_PATH=$dirname
export LD_LIBRARY_PATH
$dirname/$appname "$@"
4.执行程序
赋予test.sh执行权限,
chmod +x test.sh
执行程序
./test.sh
将此目录打包发布即可,注意需要执行程序时是运行test.sh文件,不是release生成的可执行程序
方法三:
打包发布Linux 版Qt应用
1、把编译的应用 主程序(例如 myqtapp) 复制 到 另一简单起名的文件夹,例如 主目录下 ~/myapp
(把应用所需的SQLite等数据库也一同放入,或者放入程序代码指定的位置,例如 /var/opt内的位置,程序使用的普通图片,按代码指定也放入指定位置或 ~/myapp内,例如,我的是放在 ~/myapp/images)
2、程序需要用到的各个插件也从Qt安装目录中复制到主程序目录内
(例如在 /opt/Qt5.8.0/5.8/gcc_64/plugins ,我用到 platforms 、 sqldrivers 和 imageformats,其中 platforms我只用到 libqxcb.so,则platforms夹内需libqxcb.so一个文件即可,sqldrivers是SQLite,Mysql驱动,imageformats是图片调用需要)
3、复制必须的 库文件 ,先建立 脚本(cplib.sh),
vi ~/myapp/cplib.sh
内容是:
#!/bin/bash
LibDir=$PWD"/lib"
Target=$1
lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))
$(mkdir $LibDir)
for Variable in ${lib_array[@]}
do
cp "$Variable" $LibDir
done
终端下执行命令:
cd ~/myapp
chmod +x cplib.sh
./cplib.sh myqtapp
完成后,可以见到在 ~/myapp目录内生成lib目录,内有主程序需用到的多个库文件,从中取出必要的部分,不需要全部文件
建立 ~qtlib文件夹,从 ~/myapp/lib 内复制以下必需库文件:
libicudata.so.56、libicui18n.so.56、libicuuc.so.56、libQt5Core.so.5、libQt5DBus.so.5、libQt5Gui.so.5、libQt5Network.so.5、libQt5PrintSupport.so.5、libQt5SerialPort.so.5、libQt5Sql.so.5、libQt5Widgets.so.5件和文件名中包含xcb的全部文件,例如 libX11-xcb.so.1、libxcb.so.1等
(libQt5Network.so.5、libQt5PrintSupport.so.5、libQt5SerialPort.so.5、libQt5Sql.so.5这些是我的主程序使用,自动找到,如没有对应功能,则没有对应文件)
4.复制 libqxcb.so 需要的库文件
先把 cplib.sh 复制 一份 ,放入 ~/myapp/platforms,然后
cd ~/myapp/platforms
./cplib.sh libqxcb.so
完成后, ~/myapp/platforms目录内生成lib目录,内有libqxcb.so需用到的多个库文件,从中取出必要的部分,不需要全部文件,也是复制 到 ~qtlib文件夹
libQt5DBus.so.5、libQt5XcbQpa.so.5、和文件名中包含xcb的全部文件。
5.目标机器安装 qtlib
把 qtlib 文件夹内容 放入 /usr/local/lib/qtlib
sudo权限 在/etc/ld.so.conf.d 下增加文件 usr-libs.conf
内容 是
/usr/local/lib/qtlib
然后 执行 sudo ldconfig
6.最后检查是否缺少 其他库文件,在终端下 运行 主程序
如没有 正常运行,会有出错信息提示,查看其中 的 库文件名 libXXXX.so.XX,在Qt的安装目录 中找文件
例如在:/opt/Qt5.8.0/5.8/gcc_64/lib
要注意的是区分所复制出来的文件不能是链接文件同,要找到真正的库文件,复制 到 /usr/local/lib/qtlib ,并重命名这库文件 在出错信息中显示的正确的文件名
重新执行 sudo ldconfig
重复 这第6步,直到能正常启动主程序,一般情况 下经过前面5步后,正常方式 执行应用(myqtapp)或应用启动器(myqtapp.desktop)后,没有正常显示出画面,才需要这第6步。
7. 最后, ~/myapp文件夹 就是 应用程序包含文件,一般安装放入 /opt/myapp内,有变动的文件安装一般放入/var/opt/myapp内,必需的Qt库文件一般安装放入 /usr/local/lib/qtapp(参照第5步),目标机器上就安装完成,最后,建立桌面启动器(其中 指定了 图标)
vi myqtapp.desktop
内容是
[Desktop Entry]
Version=1.0
Name=myqtapp
GenericName=myqtapp
Comment=myqtapp
Exec=/opt/myapp/myqtapp
Icon=/opt/myapp/images/myapp.ico
Terminal=false
Type=Application
Categories=Application;
StartupNotify=true
X-Desktop-File-Install-Version=0.22
8.打包,安装 都完成了。
今天的文章Linux下Qt程序的打包发布分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/25407.html