1. 程式人生 > >Qt實用技巧:ubuntu釋出程式打包流程(解決外掛xcb載入失敗)

Qt實用技巧:ubuntu釋出程式打包流程(解決外掛xcb載入失敗)

原博主部落格地址:https://blog.csdn.net/qq21497936
本文章部落格地址:https://blog.csdn.net/qq21497936/article/details/85396652

 

        Qt實用技巧:ubuntu釋出程式打包流程(解決外掛xcb載入失敗)

 

前言

       做跨平臺開發經常遇見程式打包,打包不可怕,可怕的是明明打包完了,卻在裸機上執行出現外掛錯誤,明明拷入外掛庫為啥還是會載入xcb失敗呢(當前場景僅測試ubuntu)?下面根據需求完成打包流程。

 

需求

       釋出qt應用程式,解壓後直接可以執行。

 

打包流程

步驟一:基礎依賴庫打包(建立打包指令碼)

       在開發機上生成需要釋出的應用,如下圖:

       

       建立copyLibs.sh指令碼,拷貝下列指令碼內容,該指令碼是用於拷貝應用所依賴的庫至當前資料夾:

#!/bin/sh 
# 釋出程式的名稱(引數1,執行指令碼時輸入)
exe=$1
# 修改輸出可執行檔案路徑(當前路徑)
destDir=`pwd`
# ldd將所有依賴庫生成字串組
dependenLibsList=$(ldd $exe | awk '{if  (match($3,"/")){ printf("%s "),$3 } }') 
# 將字串組裡面的庫拷貝到目標資料夾
cp $dependenLibsList $destDir

       指令如下:

gedit copyLibs.sh

       將上述指令碼拷貝進去後儲存,如下圖:

        

       然後執行:

chmod +x copyLibs.sh
./copyLibs.sh

       如下圖:

       

步驟二:執行指令碼(建立執行指令碼)

       建立執行指令碼,在目標機上執行的時候,需要將qt的環境變數加入,方便找尋依賴庫的路徑等等,建立執行指令碼,指令碼名必須是”應用名.sh

”,執行如下指令:

       

       在myApp.sh輸入以下指令碼:

#!/bin/sh 
# 獲取應用名稱(如應用名稱為app,那麼指令碼為app.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 "[email protected]"

       myApp.sh截圖如下:

       

       讀者可以直接執行,可以得出開發機執行成功。

步驟三:補充外掛

       執行到目標機(虛擬機器裸ubuntu16.04 amd64)上,執行如下圖,需要補充外掛資料夾:

       

       以上這種情況是需要拷貝到平臺外掛資料夾到應用目錄下,所有釋出程式都需要拷貝platforms資料夾,主要是拷貝釋出的平臺所對應的外掛,如下圖:

       

       可以全部拷貝,省事,或者只拷貝xcb(ubuntu只用到這個)。

       筆者這裡拷貝整個資料夾,將其他的都刪掉,只剩libqxcb.so,執行仍然是載入外掛xcb失敗。

       其實這個時候外掛是存在了,也載入到了,為什麼載入失敗呢,是因為xcb外掛本身依賴一些庫,而這些庫在ldd裡面並沒有體現出來(應用中沒有用到)。

步驟四:執行除錯外掛(重點解決xcb載入失敗)

       這裡除錯時,有一個技巧,開啟外掛除錯配置:

export QT_DEBUG_PLUGINS=1

       然後再執行應用指令碼,可檢視外掛載入過程,如下圖:

       

       缺少libQt5XcbQpa.so.5,將該庫拷貝到應用目錄下,這裡注意qt庫只有libQt5XcbQpa.so.5.9.3是實體,如libQt5XcbQpa.solibQt5XcbQpa.so.5libQt5XcbQpa.so.5.9都是連線檔案,拷貝時特別注意,別隻拷貝了連線,那是不會有作用的,具體如下圖:

       

       在開發機上,庫的路徑在Qt安裝目錄下,如下圖:

       

       此時,我們直接拷貝libQt5XcbQpa.so.5.9.3到應用目錄下,並改名為libQt5XcbQpa.so.5即可,繼續執行指令碼,如下圖:

       

       所以,按照上述方法繼續拷貝libQt5Dbus.so.5庫,然後執行指令碼,即可執行成功!!!

步驟五:優化步驟一的基礎依賴庫打包指令碼

       讀者可以將xcb平臺libQt5XcbQpa.so.5和libQt5Dbus.so.5通過指令碼寫入copyLibs.sh,從而執行一個指令碼即可,省略步驟四(主要是偶爾用到,經常忘記導致有點麻煩  =_= )。

       新增什麼指令碼進去,歡迎讀者自行補充,歡迎提交評論,筆者就不做了。

 

執行包

       將打包流程最後的包打成一個tar,放到目標機上解壓後,直接執行指令碼即可,也可以達成deb或者其他ubuntu可執行的軟體安裝包,具體方法請讀者自行百度,筆者暫時沒這方面的需求。

 

原博主部落格地址:https://blog.csdn.net/qq21497936
本文章部落格地址:https://blog.csdn.net/qq21497936/article/details/85396652