一、简介:
Linux下Qt程序的发布的方法,网上大部分都是复制粘贴,没多大区别。这些方法有的适合旧版本,有的写得不清楚(毕竟复制粘贴),所以用起来总是不顺手。经过本人近2天的探索,最终成功将一个虚拟机编译得到的软件发布到另一台机器,并完美运行。
话不多说,直入重点。
1、本文编译和发布使用的环境:
Linux版本:64位的CentOS_7(内核版本Linux_4.7.3,自己升级了内核)
Qt版本:64位的Qt_5.6.1-1
本文用例软件链接:https://pan.baidu.com/s/1slaRzPz
2、本文目标运行环境:
Linux版本: 64位的CentOS_7(内核版本3.10.0,全新安装,未新安装任何补丁和程序)
3、本文作者Explorer_ZCH,本文发布时间2016.09.12
二、总体思路:
编译程序 ——> 拷贝共享库(解决依赖)——> 拷贝平台文件 ——> 发布软件
三、详细步骤:
1、 使用Qt,将写好的代码,编译成Release版(注意是:Release版)
2、 拷贝编译得到的 可执行文件 到一个新建文件夹下(注意 文件夹的名称 和 可执行文件的名称 最好保持一致,这样可以使后续操作更方便)
3、 查询软件运行需要的共享库
ldd ./可执行文件名称
4、 拷贝共享库到可执行文件所在目录下
使用 ldd 命令后可以查询到需要非常多的库,一个一个的人工复制怎么会是程序猿的作风。编写如下脚本:
#!/bin/sh
exe="ShuangSeQiu"
des="/home/explorer/桌面/ShuangSeQiu"
deplist=$(ldd $exe | awk '{if (match($3,"/")){ printf("%s "),$3 } }')
cp $deplist $des
上述代码可直接复制,但是一定要修改2个地方:exe和des等号后的内容。
将脚本保存为 cp.sh(脚本文件名无所谓,但是后缀一定要是 .sh)。
将脚本文件放在可执行文件所在目录下,在可执行文件所在目录下打开命令行,依次执行下面命令:
sudo chmod +x ./脚本文件名.sh (给定可执行权限)
sudo ./脚本文件名.sh (执行脚本命令)
该脚本可自动将 ldd 查询得到的库全部复制到可执行文件所在目录下。
5、 拷贝 额外的库 到 可执行文件所在目录 下
Qt_5.6的程序在发布时还需要额外拷贝几个库(似乎Qt5其它版本也都这样),不然会出现:This application failed to start because it could not find or load the Qt platform plugin “xcb” 的错误。
在可执行文件所在目录下打开命令行,执行:
sudo cp Qt的安装路径/Qt5.6.1/5.6/gcc_64/lib/ libQt5XcbQpa.so* ./
sudo cp Qt的安装路径/Qt5.6.1/5.6/gcc_64/lib/ libQt5DBus.so* ./
(注意so后面加*号,因为该路径下有4个名称接近的库,实际运行时可能需要这4个中的1个或几个,本人未测试具体是哪个,图方便就都拷贝了)
6、 拷贝平台文件
将 Qt的安装路径/Qt5.6.1/5.6/gcc_64/ plugins/platforms 整个目录全部拷贝到可执行文件所在目录下。别问为什么,就是全拷贝。
7、 发布软件
执行完毕上面6项后,就可以将程序打包发布了,或者直接将可执行文件所在目录全部拷贝到另一台Linux机器上。
8、 运行环境配置
将软件拷贝到另一台Linux机器上后,还需要对该机器的运行环境略作配置。命令行执行下面命令:gedit ~/.bashrc
在文件内容的最后另起一行,将下面内容加在后面:
export PATH=$PATH:"."
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"."
(Ubuntu上应该这样写:
export PATH=".":$PATH
export LD_LIBRARY_PATH=".":$LD_LIBRARY_PATH
)
保存后,命令行执行:source ~/.bashrc (使环境配置文件重载生效)
9、 运行软件
双击可执行文件,或者命令行运行
四、 其它情况
经过以上步骤,仍然可能无法在目标机器上运行发布的软件,现提供一种解决办法。
a) 在目标机器上,在发布的软件路径下打开终端,运行
export QT_DEBUG_PLUGINS=1;
b) 然后再次在终端运行可执行文件,此时可以将调试信息打印出来,可以看到软件还需要的库;
c) 拷贝查询得到的库文件到目标主机;
d) 再次运行软件。
本文的第三段中第5小段就是如此得到的,查询出来的需要的一个库是libQt5XcbQpa.so.5,但本人把libQt5XcbQpa.so.5这个库从编译机拷贝到目标机上,目标机仍然无法正确运行发布的软件,故我把4个libQt5XcbQpa.so*的文件全部拷贝过去,终不再提示缺少libQt5XcbQpa.so.5。