Linux下Qt程序的打包发布

 

为便于描述,咱们这里假设生成的程序名称为test(即要发布的程序名称)
方法一:
1. QtCreate使用Release版本编译

将编译后生成的可执行程序(如:test)复制到一个空目录下
 sql

2.使用ldd命令查看和导出须要的库数据库

在步骤1的目录下新建一个pack.sh文件,文件内容以下:bash

 

 
  1. #!/bin/sh app

  2. exe="test" #你须要发布的程序名称ui

  3. des="/home/someone/QtProject/build-test-Desktop-Release/Test" #步骤1中的目录即本文件所在目录spa

  4. deplist=$(ldd $exe | awk '{if (match($3,"/")){ printf("%s "),$3 } }') 插件

  5. cp $deplist $descode

 

 

文件中有两处中文注释的地方须要修

3.编写执行程序的sh文件
在此目录下再新建一个test.sh文件(文件名必须与可执行文件名字同样), 
文件内容以下(不须要修改):orm

 

 
  1. #!/bin/sh图片

  2. appname=`basename $0 | sed s,\.sh$,,`

  3. dirname=`dirname $0`

  4. tmp="${dirname#?}"

  5. if [ "${dirname%$tmp}" != "/" ]; then

  6. dirname=$PWD/$dirname

  7. fi

  8. LD_LIBRARY_PATH=$dirname

  9. export LD_LIBRARY_PATH

  10. $dirname/$appname "$@"

 

 

4.执行程序
赋予test.sh执行权限,
chmod +x test.sh

执行程序
./test.sh
将此目录打包发布便可,注意须要执行程序时是运行test.sh文件,不是release生成的可执行程序

 

 

 

方法二:

打包发布Linux 版Qt应用
一、把编译的应用 主程序(例如 myqtapp) 复制 到 另外一简单起名的文件夹,例如 主目录下 ~/myapp
(把应用所需的SQLite等数据库也一同放入,或者放入程序代码指定的位置,例如 /var/opt内的位置,程序使用的普通图片,按代码指定也放入指定位置或 ~/myapp内,例如,个人是放在 ~/myapp/images)
 

二、程序须要用到的各个插件也从Qt安装目录中复制到主程序目录内
(例如在 /opt/Qt5.8.0/5.8/gcc_64/plugins ,我用到 platforms 、 sqldrivers 和 imageformats,其中 platforms我只用到 libqxcb.so,则platforms夹内需libqxcb.so一个文件便可,sqldrivers是SQLite,Mysql驱动,imageformats是图片调用须要)
 

三、复制必须的 库文件 ,先创建 脚本(cplib.sh),
vi ~/myapp/cplib.sh
内容是:

 

 
  1. #!/bin/bash

  2. LibDir=$PWD"/lib"

  3. Target=$1

  4. lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))

  5. $(mkdir $LibDir)

  6. for Variable in ${lib_array[@]}

  7. do

  8. cp "$Variable" $LibDir

  9. done


终端下执行命令:

 

 
  1. cd ~/myapp

  2. chmod +x cplib.sh

  3. ./cplib.sh myqtapp


完成后,能够见到在 ~/myapp目录内生成lib目录,内有主程序需用到的多个库文件,从中取出必要的部分,不须要所有文件
创建 ~qtlib文件夹,从 ~/myapp/lib 内复制如下必需库文件:
libicudata.so.5六、libicui18n.so.5六、libicuuc.so.5六、libQt5Core.so.五、libQt5DBus.so.五、libQt5Gui.so.五、libQt5Network.so.五、libQt5PrintSupport.so.五、libQt5SerialPort.so.五、libQt5Sql.so.五、libQt5Widgets.so.5件和文件名中包含xcb的所有文件,例如 libX11-xcb.so.一、libxcb.so.1等
(libQt5Network.so.五、libQt5PrintSupport.so.五、libQt5SerialPort.so.五、libQt5Sql.so.5这些是个人主程序使用,自动找到,如没有对应功能,则没有对应文件)
 

 

4.复制 libqxcb.so 须要的库文件
先把 cplib.sh 复制 一份 ,放入 ~/myapp/platforms,而后
cd ~/myapp/platforms
./cplib.sh libqxcb.so
完成后, ~/myapp/platforms目录内生成lib目录,内有libqxcb.so需用到的多个库文件,从中取出必要的部分,不须要所有文件,也是复制 到 ~qtlib文件夹
libQt5DBus.so.五、libQt5XcbQpa.so.五、和文件名中包含xcb的所有文件。
 

5.目标机器安装 qtlib
把 qtlib 文件夹内容 放入 /usr/local/lib/qtlib
sudo权限 在/etc/ld.so.conf.d 下增长文件 usr-libs.conf
内容 是
/usr/local/lib/qtlib
而后 执行 sudo ldconfig
 

6.最后检查是否缺乏 其余库文件,在终端下 运行 主程序
如没有 正常运行,会有出错信息提示,查看其中 的 库文件名 libXXXX.so.XX,在Qt的安装目录 中找文件
例如在:/opt/Qt5.8.0/5.8/gcc_64/lib
要注意的是区分所复制出来的文件不能是连接文件同,要找到真正的库文件,复制 到 /usr/local/lib/qtlib ,并重命名这库文件 在出错信息中显示的正确的文件名
从新执行 sudo ldconfig
重复 这第6步,直到能正常启动主程序,通常状况 下通过前面5步后,正常方式 执行应用(myqtapp)或应用启动器(myqtapp.desktop)后,没有正常显示出画面,才须要这第6步。
 

7. 最后, ~/myapp文件夹 就是 应用程序包含文件,通常安装放入 /opt/myapp内,有变更的文件安装通常放入/var/opt/myapp内,必需的Qt库文件通常安装放入 /usr/local/lib/qtapp(参照第5步),目标机器上就安装完成,最后,创建桌面启动器(其中 指定了 图标)
vi myqtapp.desktop
内容是

 

 
  1. [Desktop Entry]

  2. Version=1.0

  3. Name=myqtapp

  4. GenericName=myqtapp

  5. Comment=myqtapp

  6. Exec=/opt/myapp/myqtapp

  7. Icon=/opt/myapp/images/myapp.ico

  8. Terminal=false

  9. Type=Application

  10. Categories=Application;

  11. StartupNotify=true

  12. X-Desktop-File-Install-Version=0.22