Ubuntu下发布Qt程序

概述

无论是在Windows下还是在Linux下,可执行程序的运行都需要依赖相关的运行库,比如Windows下运行VS编译的C++程序需要安装对应的C++运行时库。这次本文来讨论讨论Linux下(主要针对Ubuntu/Debian)如何发布Qt程序,如何查看编译好的Qt程序需要哪些依赖的运行库,以及如何让Qt程序在没有安装Qt开发工具的机器上跑起来呢?

测试环境说明

  • 发布环境:Ubuntu 14.04 LTS Desktop x64 with Qt5.5.1
  • 目标运行环境:Ubuntu 14.04 LTS Server x64

如何查看程序所依赖的运行库

在查看之前,需要先利用发布环境中的Qt将程序编译成Release版本,并将主程序拷贝出来。例如,我把刚编译好的服务端程序server拷贝到/home/laijingwu/目录下。

现在需要在发布环境打开一个终端,并利用ldd命令来查看依赖运行库。

ldd 程序名

我的服务端程序命名为server,则运行命令 ldd server

看一看结果中来自Qt目录下的运行库。

并将这些软连接所指向的源文件复制到与程序同一目录下,并打包。

注意:ldd命令所列举的可能是运行库的软连接,需要复制源文件

至此,我们就已经将所需的运行库和程序打包好了,可以准备部署到服务器上了。

部署Qt程序到Ubuntu/Debian服务器上

部署第一步,需要将刚刚打包好的运行库和程序上传到服务器上,本次测试我上传到/home/test/目录并解包,完成后当然要打开服务器Shell。

现在我们先尝试运行程序,但报错

./server: error while loading shared libraries: libQt5Network.so.5: cannot open shared object file: No such file or directory

出现这个报错的原因是因为系统并没有将程序这个目录列入为库路径。

通过Google查到三种方法来解决这个问题

  1. 利用ln命令将所需so文件链接到 /usr/lib 或 /lib 这两个默认的目录下
    sudo ln -s /home/test/server/*.so /usr/lib
    sudo ldconfig
    
  2. 修改LD_LIBRARY_PATH
    sudo export LD_LIBRARY_PATH=/home/test/server:$LD_LIBRARY_PATH
    sudo ldconfig
    
  3. 修改/etc/ld.so.conf 并刷新
    sudo vim /etc/ld.so.conf
    
  4. 写入 add /home/test/server
    sudo ldconfig
    

总结这三种方法,建议先将程序目录的so文件复制到/usr/lib或/lib目录下,然后通过运行程序得到的缺失库提示,来建立软连接。

例如,刚刚运行提示缺少libQt5Network.so.5,那么只需要执行命令(前提是已经将程序目录的so文件全部复制到了lib目录下)

sudo ln -s /usr/lib/libQt5Network.so.5.5.1 /usr/lib/libQt5Network.so.5

以此类推,将缺少的软连接补齐,这时就能成功启动程序。客户端就可以进行连接了!