Ubuntu18下打包Qt程序


如題,近期因為項目需求,得打包QT程序,並將程序放到沒有安裝QT庫的電腦上運行。網上索羅了下,打包QT程序的方式很多,主要分為以下幾種:

1. 打包成安裝包形式;

2. 打包成二進制文件,附帶運行庫的形式:

  • windows下,有很多工具,教程也比較多,運行庫基本是dll文件
  • linux下,需要靠腳本協助,很多教程都不完整,運行庫基本是so文件

筆者這里只演示如何在linux下打包免安裝程序,程序名稱為giptables,QT版本是5.7.1,以下如出現這個名稱,則一律替換成讀者自己的應用程序名稱。

0、找個地方,比如桌面,創建空文件夾Giptables,這個將用來存放giptables程序的運行文件

1、先將工程使用Release模式編譯

2、打開編譯輸出文件的文件夾(帶二進制文件giptables的那個)

筆者的文件夾名稱是build-giptables-Desktop_Qt_5_7_1_GCC_64bit-Release

3、在上一步的文件夾中新建文件copylib.sh,通過指令設置權限chmod 777 copylib.sh

4、在 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

5、打開終端並進入到當前文件夾,輸入./copylib.sh giptables

其中, giptables 是運行copylib.sh 腳本的參數,腳本實際上是調用了 ldd giptables指令獲得giptables運行時需要哪些庫,並將庫都復制放到當前目錄的lib文件夾中。

運行完上述指令后,同目錄下會生成lib文件夾,這里我們將其稱作giptables的庫文件夾,避免與下文內容混淆

6、將giptables的二進制文件和 giptables的庫文件夾里所有的文件復制到Giptables文件夾中,注意:這里是把lib里的所有文件復制出來,不用復制lib文件夾

7、進入QT的安裝目錄,找到platforms文件夾,筆者的路徑是

~/Qt5.7.1/5.7/gcc_64/plugins/platforms
將整個platforms文件夾復制到Giptables文件夾中,注意:這時復制的是整個文件夾,這使得Giptables文件夾中會多出一個platforms文件夾

8、將上文的copylib.sh放到Giptables/platforms/中,並運行./copylib.sh libqxcb.so,這時會得到lib文件夾——libqxcb.so的庫文件夾

ps:為什么是libqxcb.so呢?具體看文末的參考資料,這個跟你要運行的程序有關,需要用到哪些QT的庫,就再打包對應的東西。

9、將libqxcb.so的庫文件夾中的所有文件復制Giptables文件夾中,然后刪除掉Giptables/platforms/lib文件夾

10、在Giptables文件夾中新建腳本giptables.sh,執行chmod 777 giptables.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 "$@"

到這里就基本完成了,將Giptables文件夾復制到需要運行程序的目標主機即可,在目標主機中,運行程序,都采用 ./giptables.sh而不是./giptables,即運行程序的sh腳本,而不是二進制文件

過程中遇到的問題:
1、運行copylib.sh時報找不到庫的錯誤:必須保證在源文件夾中運行copylib.sh,而不能先將文件復制出來,然后再運行copylib.sh生成lib
2、在目標主機中提示

This application failed to start because it could not find or load the Qt platform plugin “xcb”

這是因為沒有生成libqxcb.so的庫文件夾,或者沒有將生成的文件夾中所有的文件放到giptables.sh同一級目錄下,筆者最后生成的目錄結構如下

Giptables(文件夾) -- platforms(文件夾) -- libqxcb.so
                 |                    \__ *.so
                 |
                 \__ giptables.sh
                 \__ *.so

參考資料 http://doc.qt.io/qt-5/linux-deployment.html

原文鏈接:https://blog.csdn.net/z3512498/java/article/details/64922180


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM