网上搜索有两种方案,一种是需要利用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文件夹复制到可执行文件所在的目录下即可。
由此可见,出现段错误、吐核、已放弃等报错,基本是因为缺少某个库文件或者库文件不对所导致的,出现此类错误,就需要仔细核对库文件情况。