centOS打包发布Qt程序的方法及出错时的部分解决方案

网上搜索有两种方案,一种是需要利用linuxdeployqt这样一个程序进行操作,一个是免安装的通过编写脚本来解决依赖问题。
两种问题我都尝试了,第一种还没完全成功,但是应该没什么大问题,第二种方法成功了,但是中间确实经历了一些波折。
下面我简单介绍一下这两种方案。我用的是Qt5.7.1和QtCreator4.0.1,系统是centOS 7.5。

利用Linuxdeployqt程序进行打包

这个问题比较尴尬的是,网上直接下载别人编译好的程序,可能无法直接使用,就比如我碰到的这个问题,告诉我,提示我,我的电脑中至少得安装Qt5.9及以上的版本才可以,而我的Qt是5.7的版本,这个可能是两个版本之间的库文件存在版本或者别的差异导致的。
具体的操作网上教程很多,我只简单的说一下过程。
第一步,下载linuxdeployqt,下载linuxdeployqt传送门。因为下载的是源代码,则还需要下载patchelf,下载patchelf传送门
第二步,解压linuxdeployqt压缩包,进入了,请先确认你现在的环境是否是你需要打包的软件的开发环境,比如我用的是Qt5.7.1开发的软件,则似乎这个时候,你的环境变量也需要是qt5.7.1的环境,即qmake时,需要是qt5.7.1的qmake版本。修改环境变量的方法。

gedit /ect/profile
//到文末加入下面几句
export QTDIR=/usr/local/Qt-5.7.1
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib

然后就是qmake,然后是make,不需要make install。这个时候在文件目录下会产生一个bin文件夹,在里面有一个linuxdelployqt的可执行文件,将这个文件复制到/bin目录下。
注意,网上大部分教程,都说会在目录下生成linuxdeployqt的文件夹下面有这个可执行文件,但是,可能系统不同或者别的原因,略有区别。网上的教程还说,要把这个复制到/usr/local/bin目录下,但是在centOS系统下似乎不行,应该复制到/bin目录下。
而patchelf则很简单,直接./configure,然后make,然后make install,不过默认是将可执行文件安装在/usr/local/bin目录下,可能没用,可能需要复制到/bin目录下。
第三步,将你要打包的程序Release生成的可执行文件单独放一个文件夹,然后执行命令。

linuxdeployqt mycom -appimage //mycom是我的程序

然后,我就做到这一步,在根目录下生成了一个AppRun的文件。

免安装利用脚本文件解决依赖问题

这个方法我个人感觉比上一种似乎更好用,当然,如果你需要频繁的打包可执行文件,可能是第一种方法更方便。
第一步,将你想要打包的可执行文件放在一个单独的文件夹下面。比如我的程序叫mycom。
第二步,生成一个脚本文件,并添加内容

#touch copylib.sh 
#gedit copylib.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

然后给他设置最高权限,不管用不用得着,避免出现问题。

chmod 777 copylib.sh

将copylib.sh复制到你需要发布的Qt可执行文件生成的那个Release的目录下。并运行这个脚本

#cp copylib.sh /build-mycom-qt_5.7.1-Release
#./copylib.sh mycom //这个mycom是我的可执行文件的名称

这时候在该目录下会生成一个lib文件夹,将里面的所有内容,复制到你之前创建的那个只有可执行文件的目录下。

#cd lib
#cp * /home/PowerManager/ -rf

然后去你的Qt的编译工具的安装目录下。将copylib.sh脚本复制进去并执行。

#cd /usr/local/Qt-5.7.1/plugins/platforms
#cp /home/copylib.sh ./ -rf
#./copylib.sh libqxcb.so

在这个目录下会生成一个lib文件夹,将里面的内容也全部复制到你之前生成的那个文件夹中。然后将platfroms文件夹也复制到那个目录下面。

#cd lib
#cp * /home/PowerManager/ -rf
#rm lib -rf
#cd ..
#cp platforms /home/PowerManager -rf

在你自行生成的文件夹下,创建一个脚本文件。

#touch mycom.sh
#gedit mycom.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 "$@"

这个脚本的内容就是执行可执行文件时需要进行的一些操作。所以在移植该程序后,在新的环境下,执行的不是那个可执行文件./mycom,而是这个脚本./mycom.sh。
至此,主干内容就介绍完了。但是可能还需要移一些库文件到这个文件夹下,这个看个人需求,比如我碰到的一些问题。

问题一,出现段错误吐核已放弃等字眼
第一次碰见这个问题,是我在ubuntu环境下生成可执行目录,拿到了centOS下运行,可能会出现一些问题。
第二次碰到这个问题,一个是我缺少了移动platforms这个文件夹到可执行文件的打包文件目录下。
第三次出现类似情况,同时还出现如下报错。

QXcbConnection:Could not connect to disploy

这个问题是因为我是利用SSH远程连接的linux系统进行的操作,才会出现这个问题,桌面操作时不会有这个问题的。
第四次出现类似情况的同时,还出现如下报错。

QSqlitedatabase:QSqlite driver is not loaded

这个是因为我的程序中用到了QSqlite,所以我需要将QSqlite的驱动也复制到该目录下,这个驱动在Qt-5.7.1下的plugins目录下的sqldrivers文件夹中,将sqldrivers文件夹复制到可执行文件所在的目录下即可。
由此可见,出现段错误、吐核、已放弃等报错,基本是因为缺少某个库文件或者库文件不对所导致的,出现此类错误,就需要仔细核对库文件情况。

发布了45 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/baidu_31788709/article/details/90678275
今日推荐