qt linux 打包

本文在银河麒麟上成功运行,程序类型:Qt控制台,使用到的Qt外库:mysql数据库

1、环境一共有两台,1是编译机【装有Qt、数据库】,2是运行机【纯净机】

2、在编译机上安装Qt、mysql,我这里的Qt使用的是Qt5.6.1,mysql是5.7.28

3、解决Qt不能连接数据库问题

写一个访问Mysql的demo,运行打印Driver not loaded【如果没有报驱动问题,就跳过此步】

进入:/home/rainbow/zhuxy/app/Qt5.6.1/5.6/gcc_64/plugins/sqldrivers

执行:ldd libqsqlmysql.so 

显示有三个so not found,在网上找到

放在下图路径下:

 在运行demo,应该不会报驱动的问题了,如果还有就上网上解决办法,这一步就是用来解决当前编译机能正常访问mysql

4、将demo编译成release可执行文件,名字是test

5、新建空文件夹,将可执行文件放进去;新建两个脚本findso.sh,test.sh【和可执行文件名字一样】

6、findso.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

原理是再当前路径新建lib文件夹,再将指定文件所依赖的so赋值到此文件夹中

7、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 "$@"

这个脚本用来拉起和它名字一样的可执行文件。为什么不直接拉可执行文件呢?因为linux寻找so的路径没有包含当前路径,而我们已经将依赖的so放在当前路径了,所以需要让linux首先在当前路径找so,

就是上面的:LD_LIBRARY_PATH=$dirname  export LD_LIBRARY_PATH

8、找所有的so

在文件夹中打来终端,执行:findso.sh test,执行完毕会在当前路径生成lib文件夹,将lib文件夹的所有so移动到当前文件夹并删除lib

9、将Qt自己的sqldriver文件夹赋值到当前文件夹

路径:/home/rainbow/zhuxy/app/Qt5.6.1/5.6/gcc_64/plugins/sqldrivers

10、将3中的so赋值到当前文件夹

最终样子,红色的是手动加的,其他的是findso脚本找到的。

 11、将文件夹复制到目标机,执行./test.sh拉起软件

不出意外就能拉起

ps

1、如果拉起还是发现有问题,首先看什么so没有找到,ldd test。也可以添加拉软件的打印信息:export QT_DEBUG_PLUGINS=1,然后再拉软件,就能看到找依赖so的过程

2、目前发现控制台软件很好打包,但是带有widget的软件一直报xcb问题,目前还没解决,毕竟没有这样的项目,先不管

原文地址:https://www.cnblogs.com/judes/p/11943203.html