centOS打包發佈Qt程序的方法及出錯時的部分解決方案

網上搜索有兩種方案,一種是需要利用linuxdeployqt這樣一個程序進行操作,一個是免安裝的通過編寫腳本來解決依賴問題。
兩種問題我都嘗試了,第一種還沒完全成功,但是應該沒什麼大問題,第二種方法成功了,但是中間確實經歷了一些波折。
下面我簡單介紹一下這兩種方案。我用的是Qt5.7.1和QtCreator4.0.1,系統是centOS 7.5。

利用Linuxdeployqt程序進行打包

這個問題比較尷尬的是,網上直接下載別人編譯好的程序,可能無法直接使用,就比如我碰到的這個問題,告訴我,提示我,我的電腦中至少得安裝Qt5.9及以上的版本纔可以,而我的Qt是5.7的版本,這個可能是兩個版本之間的庫文件存在版本或者別的差異導致的。
具體的操作網上教程很多,我只簡單的說一下過程。
第一步,下載linuxdeployqt,下載linuxdeployqt傳送門。因爲下載的是源代碼,則還需要下載patchelf,下載patchelf傳送門
第二步,解壓linuxdeployqt壓縮包,進入了,請先確認你現在的環境是否是你需要打包的軟件的開發環境,比如我用的是Qt5.7.1開發的軟件,則似乎這個時候,你的環境變量也需要是qt5.7.1的環境,即qmake時,需要是qt5.7.1的qmake版本。修改環境變量的方法。

gedit /ect/profile
//到文末加入下面幾句
export QTDIR=/usr/local/Qt-5.7.1
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib

然後就是qmake,然後是make,不需要make install。這個時候在文件目錄下會產生一個bin文件夾,在裏面有一個linuxdelployqt的可執行文件,將這個文件複製到/bin目錄下。
注意,網上大部分教程,都說會在目錄下生成linuxdeployqt的文件夾下面有這個可執行文件,但是,可能系統不同或者別的原因,略有區別。網上的教程還說,要把這個複製到/usr/local/bin目錄下,但是在centOS系統下似乎不行,應該複製到/bin目錄下。
而patchelf則很簡單,直接./configure,然後make,然後make install,不過默認是將可執行文件安裝在/usr/local/bin目錄下,可能沒用,可能需要複製到/bin目錄下。
第三步,將你要打包的程序Release生成的可執行文件單獨放一個文件夾,然後執行命令。

linuxdeployqt mycom -appimage //mycom是我的程序

然後,我就做到這一步,在根目錄下生成了一個AppRun的文件。

免安裝利用腳本文件解決依賴問題

這個方法我個人感覺比上一種似乎更好用,當然,如果你需要頻繁的打包可執行文件,可能是第一種方法更方便。
第一步,將你想要打包的可執行文件放在一個單獨的文件夾下面。比如我的程序叫mycom。
第二步,生成一個腳本文件,並添加內容

#touch copylib.sh 
#gedit 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

然後給他設置最高權限,不管用不用得着,避免出現問題。

chmod 777 copylib.sh

將copylib.sh複製到你需要發佈的Qt可執行文件生成的那個Release的目錄下。並運行這個腳本

#cp copylib.sh /build-mycom-qt_5.7.1-Release
#./copylib.sh mycom //這個mycom是我的可執行文件的名稱

這時候在該目錄下會生成一個lib文件夾,將裏面的所有內容,複製到你之前創建的那個只有可執行文件的目錄下。

#cd lib
#cp * /home/PowerManager/ -rf

然後去你的Qt的編譯工具的安裝目錄下。將copylib.sh腳本複製進去並執行。

#cd /usr/local/Qt-5.7.1/plugins/platforms
#cp /home/copylib.sh ./ -rf
#./copylib.sh libqxcb.so

在這個目錄下會生成一個lib文件夾,將裏面的內容也全部複製到你之前生成的那個文件夾中。然後將platfroms文件夾也複製到那個目錄下面。

#cd lib
#cp * /home/PowerManager/ -rf
#rm lib -rf
#cd ..
#cp platforms /home/PowerManager -rf

在你自行生成的文件夾下,創建一個腳本文件。

#touch mycom.sh
#gedit mycom.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 "$@"

這個腳本的內容就是執行可執行文件時需要進行的一些操作。所以在移植該程序後,在新的環境下,執行的不是那個可執行文件./mycom,而是這個腳本./mycom.sh。
至此,主幹內容就介紹完了。但是可能還需要移一些庫文件到這個文件夾下,這個看個人需求,比如我碰到的一些問題。

問題一,出現段錯誤吐核已放棄等字眼
第一次碰見這個問題,是我在ubuntu環境下生成可執行目錄,拿到了centOS下運行,可能會出現一些問題。
第二次碰到這個問題,一個是我缺少了移動platforms這個文件夾到可執行文件的打包文件目錄下。
第三次出現類似情況,同時還出現如下報錯。

QXcbConnection:Could not connect to disploy

這個問題是因爲我是利用SSH遠程連接的linux系統進行的操作,纔會出現這個問題,桌面操作時不會有這個問題的。
第四次出現類似情況的同時,還出現如下報錯。

QSqlitedatabase:QSqlite driver is not loaded

這個是因爲我的程序中用到了QSqlite,所以我需要將QSqlite的驅動也複製到該目錄下,這個驅動在Qt-5.7.1下的plugins目錄下的sqldrivers文件夾中,將sqldrivers文件夾複製到可執行文件所在的目錄下即可。
由此可見,出現段錯誤、吐核、已放棄等報錯,基本是因爲缺少某個庫文件或者庫文件不對所導致的,出現此類錯誤,就需要仔細覈對庫文件情況。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章