昨天終於改好了一個開源但是用起來有問題的串口調試助手,想把它打包一下以后在其他電腦上也可以用。
找了網上的一個教程打包后,在本機上可以正常使用,但是移植到另一台上就出現缺少xcb
的提示。
上網搜資料倒騰了一番后,發現libqxcb.so
鏈接文件出了一些問題,問題有點大,也意識到這一部分依賴的配置是有問題的。
於是重新搜索QT在Linux下的打包流程,發現了有一份教程比之前的教程多了一步用腳本給libqxcb.so
尋找依賴庫的操作,感覺找到了正解。
果然,這次沒有再出現xcb
的加載問題。感謝網絡上的大佬!
如題,近期因為項目需求,得打包QT程序,並將程序放到沒有安裝QT庫的電腦上運行。網上索羅了下,打包QT程序的方式很多,主要分為以下幾種:
- 打包成安裝包形式;
- 打包成二進制文件,附帶運行庫的形式:
- 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