前提条件:
程序名称:test
程序源代码所在目录:test_proj
QT版本:5.9.9
1.执行以下命令,跳转到当前用户的家目录,创建test目录,用来存放test程序的运行文件
cd ~
mkdir test
2.将工程使用Release模式编译(cmake方式编译出来就是release)
3.跳转到/test_proj/build/(不同的编译方式编译的目录文件夹名称不同)文件夹下,执行以下命令,创建copylib.sh脚本,通过指令设置权限chmod 777 copylib.sh
touch copylib.sh //创建copylib.sh脚本
chmod 777 copylib.sh //给copylib.sh添加可执行权限
gedit copylib.sh //使用gedit打开copylib.sh脚本
在打开的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
4.在build文件夹下,执行./copylib.sh test (test为第2步编译出来的二进制文件),执行完之后,在build目录下,会生成lib文件夹
5.将第2步生成的二进制文件(test)和第4步生成的lib文件夹下文件拷贝到第1步创建的test文件夹中(只拷贝lib中的文件)
6.进入QT的安装目录,找到platforms
文件夹,笔者的路径是:
/opt/Qt5.9.9/5.9.9/gcc_64/plugins/platforms
将整个platforms
文件夹拷贝到第1步创建的test文件夹
中
7.将第3步中创建的copylib.sh
放到/test/platforms/
中,并运行./copylib.sh libqxcb.so
,这时会得到lib文件夹
8.将第7步中生成的lib文件夹
中的所有文件拷贝test文件夹
中,然后删除掉test/platforms/lib
文件夹
9.在test文件夹
中新建脚本run.sh
,执行chmod 777 run.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 "$@"
10.运行程序,执行./run.sh
=========================================================================
注意:
本人在实际操作中,以上运行完出现了以下几个问题:
1.报一些第三方库未加载的问题,由于本人依赖其他第三方库,而在打包的时候未将这些第三方库的.so文件加进去,导致报错,所以如果有依赖第三方库的话,也需要将依赖的第三方库的so也添加到test目录下。
2.除了上面这个问题,在运行程序的时候报出以下问题:
遇到这个问题,首先在终端下执行:export QT_DEBUG_PLUGINS=1
然后在重现运行程序:./run.sh
这样就会打出详细的信息,便于检查。
从以上详细信息可以看出,没有找到libQt5XcbQpa.so.5这个库。可是在test目录下,搜了之后发现是有这个库的。。。(原因没弄清楚。。)
解决方案:
在/opt/Qt5.9.9/5.9.9/gcc_64/lib目录下,找到libQt5XcbQpa.so.5这个库
我们将libQt5XcbQpa.so.5.9.9拷贝到test目录下,然后删除原来的libQt5XcbQpa.so.5,并将libQt5XcbQpa.so.5.9.9重命名为libQt5XcbQpa.so.5。
然后继续执行:./run.sh
不幸,还是报错,提示找不到libQt5DBus.so.5这个库。于是我又在test目录下搜了一遍,发现还是有这个库的。还能怎么办,重复上面的步骤:
在/opt/Qt5.9.9/5.9.9/gcc_64/lib目录下,找到libQt5DBus.so.5这个库
我们将libQt5DBus.so.5.9.9拷贝到test目录下,然后删除原来的libQt5DBus.so.5,并将libQt5DBus.so.5.9.9重命名为libQt5DBus.so.5。
然后继续执行:./run.sh,程序运行成功。