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.so,libQt5XcbQpa.so.5,libQt5XcbQpa.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