Qt實(shí)用技巧:在CentOS上使用linuxdeployqt打包發(fā)布qt程序
前言
??之前在ubuntu上發(fā)布qt程序相對(duì)還好,使用腳本,在麒麟上發(fā)布的時(shí)候,使用腳本就不太兼容,同時(shí)為了實(shí)現(xiàn)直接點(diǎn)擊應(yīng)用可以啟動(dòng)應(yīng)用的效果,使用linuxdeployqt發(fā)布qt程序。
??本篇文章依然是繼續(xù)發(fā)布主題,有centOS的qt項(xiàng)目需要發(fā)布,系統(tǒng)是CentOS8.2,同時(shí)也做了CentOS7.5的發(fā)布(CentOS7.5整體差上不差,就是需要先yum卸載自帶的cmake,然后源碼安裝cmake3.4)
相關(guān)博客
??《Qt實(shí)用技巧:ubuntu發(fā)布程序打包流程(解決插件xcb加載失敗)?》:在ubuntu上發(fā)布程序遇到xcb問題,當(dāng)我們將其部署到另外同樣環(huán)境但是未裝qt的環(huán)境下,運(yùn)行起來一部分是xcb文件,有一部分解決后可以正常運(yùn)行啟用,另一部分直接段錯(cuò)誤,程序宕掉(提示,段核心錯(cuò)誤,已轉(zhuǎn)存什么的),使用linuxdeployqt能解決此問題,也就是使用腳本打包的升級(jí)版本。
??《麒麟系統(tǒng)開發(fā)筆記(八):在國產(chǎn)麒麟系統(tǒng)上使用linuxdeployqt發(fā)布qt程序》:這是在麒麟上使用linuxdeployqt打包的全流程。
??《Qt實(shí)用技巧:在CentOS上使用linuxdeployqt打包發(fā)布qt程序》:這是在CentOS界面服務(wù)器上linuxdeployq打包的流程。
linuxdeployqt
??Linux部署工具linuxdeployqt將應(yīng)用程序作為輸入,并通過將應(yīng)用程序使用的資源(如庫、圖形和插件)復(fù)制到一個(gè)包中使其自包含。結(jié)果包可以作為AppDir或AppImage分發(fā)給用戶,也可以放入交叉分發(fā)包中。它可以作為構(gòu)建過程的一部分,在CMake、qmake和make等系統(tǒng)中部署用C、C++和其他編譯語言編寫的應(yīng)用程序。當(dāng)用于基于Qt的應(yīng)用程序時(shí),它可以綁定運(yùn)行應(yīng)用程序所需的Qt的特定最小子集。
源碼下載地址
??gitcode下載:https://gitcode.net/mirrors/probonopd/linuxdeployqt
linuxdeployqt編譯(CentOS系統(tǒng))
步驟一:下載解壓
??

步驟二:修改源碼,去掉版本檢查
??找到main.cpp源碼,將這一段(在192行左右)注釋掉:
??

cd linuxdeployqt-master
gedit tools/linuxdeployqt/main.cpp
??

??

步驟三:安裝三方依賴庫CMake
??centOS安裝軟件先切換至root:
su root
??

??CMake是自帶了(注意:本篇是centOS8.2,而在centOS7.5上,因?yàn)閏make自帶為cmake2.8,后續(xù)論證了,是需要卸載cmake2.8,源碼裝cmake3.20也編譯錯(cuò)誤,然后卸載又源碼安裝了cmake3.4,在centOS7.5上后續(xù)才順利make編譯linuxdeployqt)
??

??使用到了cmake-gui
yum install cmake-gui.x86_64
??

??

步驟四:從源碼安裝patchelf工具(比其他系統(tǒng)多出來的)
??因?yàn)閥um沒有,也沒有找到安裝方法,只能從源碼編譯安裝了。
??

??下載地址;https://nixos.org/releases/patchelf/patchelf-0.9/patchelf-0.9.tar.gz
wget https://nixos.org/releases/patchelf/patchelf-0.9/patchelf-0.9.tar.gz
??解壓:
tar xvf patchelf-0.9.tar.gz
??

??進(jìn)入文件夾,配置configure:
cd patchelf-0.9
./configure
??

??編譯make:
??

??安裝make install:
??

??測(cè)試:
??

步驟五:使用cmake配置
cmake CMakeList.txt
???

??因?yàn)榘惭b了git與這個(gè)工程可能不對(duì),我們直接使用源碼修改大法,直接定位到代碼給刪掉:
gedit CMakeLists.txt
??第7行至63行刪除:
??

??

??直接刪掉目錄下的緩存文件:CMakeCache.txt,然后繼續(xù):
rm CMakeCache.txt
步驟六:配置Qt的依賴環(huán)境
??系統(tǒng)qt5:
??

??而我們使用了另外安裝的qt5,所以依賴需要引入我們自己安裝的qt5上。
??使用cmake-gui來指定依賴的qt:
cmake-gui
??選擇對(duì)應(yīng)的路徑,然后使用默認(rèn)unix makefile方式配置:
??

??點(diǎn)擊“Configure”,選擇“Unix Makefiles”方式:
??

這里默認(rèn)使用了系統(tǒng)的:
??
??雖然系統(tǒng)的和我們安裝的是一樣的還是為了不出錯(cuò)需要配置以下:
??
??再配置一次:
??
步驟七:生成generate
??
步驟八:編譯make
??切入build目錄,并且使用make命令即可:
cd buildmake
??
步驟九:安裝到系統(tǒng)目錄
??沒有make install這個(gè),手動(dòng)移動(dòng)到/usr/local/bin
cp linuxdeployqt /usr/local/bin/
??
步驟十:測(cè)試是否編譯成功
??
linuxdeployqt打包流程
步驟一:準(zhǔn)備打包的應(yīng)用可執(zhí)行程序和空目錄
??新建一個(gè)工程
???
??然后找個(gè)空目錄:
??
??copy程序:
??
步驟二:引入環(huán)境變量
??qmake要引入$PATH中(注意:不指定則當(dāng)前使用的是系統(tǒng)的qmake):
??為了不影響系統(tǒng),使用腳本引入,每次打包使用之前使用source env.sh引入即可。
#!/bin/shQT_DIR=/home/yang/Qt/5.15.2/gcc_64export PATH=${QT_DIR}/bin:$PATHexport LIB_PATH=${QT_DIR}/lib:$LIB_PATHexport PLUGIN_PATH=${QT_DIR}/plugins:$PLUGIN_PATHexport QML2_PATH=${QT_DIR}/qml:$QML2_PATHexport LD_LIBRARY_PATH=${QT_DIR}/lib:$LD_LIBRARY_PATHecho $PATHecho $LIB_PATHecho $PLUGIN_PATHecho $QML2_PATHecho $LD_LIBRARY_PATH
??
步驟三:打包
??繼續(xù)打包:
// 打包命令(用這條還是非??赡苋睅?,如libxcb.icccm.so.4各種系統(tǒng)庫)
// linuxdeployqt 可執(zhí)行程序 -verbose2(不要用這條了,之前ubuntu和麒麟都沒出現(xiàn)該問題,但是centOS8.2出現(xiàn)了卻庫的問題)
// 完整打包命令(完全帶進(jìn)去了)
linuxdeployqt 可執(zhí)行程序 -appimage
??
??發(fā)現(xiàn)已經(jīng)打包成功,直接點(diǎn)擊既可以運(yùn)行了:
??
步驟四:論證
??為了進(jìn)一步驗(yàn)證,我們弄一個(gè)全新的CentOS8.2做測(cè)試,裸鏡像:
??
??之前的app3打包拷貝進(jìn)去:
??
入坑
入坑一:coro dump缺少libxcb-icccm.so.4庫
問題
??為了進(jìn)一步驗(yàn)證,我們弄一個(gè)全新的CentOS8.2做測(cè)試,裸鏡像:
??
??之前的app打包拷貝進(jìn)去:
??
??跑不起來:
??
???
原理
??毫無疑問,應(yīng)該xcb依賴的一些庫沒有導(dǎo)入進(jìn)來:
export QT_DEBUG_PLUGINS=1
??
解決
??使用linuxdeployqt的時(shí)候,使用-appimage
??