前言
之前在ubuntu上發佈qt程序相對還好,使用腳本,在麒麟上發佈的時候,使用腳本就不太兼容,同時爲了實現直接點擊應用可以啓動應用的效果,使用linuxdeployqt發佈qt程序。
本篇文章依然是繼續發佈主題,有centOS的qt項目需要發佈,系統是CentOS8.2,同時也做了CentOS7.5的發佈(CentOS7.5整體差上不差,就是需要先yum卸載自帶的cmake,然後源碼安裝cmake3.4)
《Qt實用技巧:ubuntu發佈程序打包流程(解決插件xcb加載失敗) 》:在ubuntu上發佈程序遇到xcb問題,當我們將其部署到另外同樣環境但是未裝qt的環境下,運行起來一部分是xcb文件,有一部分解決後可以正常運行啓用,另一部分直接段錯誤,程序宕掉(提示,段核心錯誤,已轉存什麼的),使用linuxdeployqt能解決此問題,也就是使用腳本打包的升級版本。
《麒麟系統開發筆記(八):在國產麒麟系統上使用linuxdeployqt發佈qt程序》:這是在麒麟上使用linuxdeployqt打包的全流程。
《Qt實用技巧:在CentOS上使用linuxdeployqt打包發佈qt程序》:這是在CentOS界面服務器上linuxdeployq打包的流程。
Linux部署工具linuxdeployqt將應用程序作爲輸入,並通過將應用程序使用的資源(如庫、圖形和插件)複製到一個包中使其自包含。結果包可以作爲AppDir或AppImage分發給用戶,也可以放入交叉分發包中。它可以作爲構建過程的一部分,在CMake、qmake和make等系統中部署用C、C++和其他編譯語言編寫的應用程序。當用於基於Qt的應用程序時,它可以綁定運行應用程序所需的Qt的特定最小子集。
gitcode下載:https://gitcode.net/mirrors/probonopd/linuxdeployqt
百度網盤下載:https://pan.baidu.com/s/1mS7bWqg8UQkfTx-5SNVGuw?pwd=1234
找到main.cpp源碼,將這一段(在192行左右)註釋掉:
cd linuxdeployqt-master
gedit tools/linuxdeployqt/main.cpp
centOS安裝軟件先切換至root:
su root
CMake是自帶了(注意:本篇是centOS8.2,而在centOS7.5上,因爲cmake自帶爲cmake2.8,後續論證了,是需要卸載cmake2.8,源碼裝cmake3.20也編譯錯誤,然後卸載又源碼安裝了cmake3.4,在centOS7.5上後續才順利make編譯linuxdeployqt)
使用到了cmake-gui
yum install cmake-gui.x86_64
因爲yum沒有,也沒有找到安裝方法,只能從源碼編譯安裝了。
wget https://nixos.org/releases/patchelf/patchelf-0.9/patchelf-0.9.tar.gz
解壓:
tar xvf patchelf-0.9.tar.gz
進入文件夾,配置configure:
cd patchelf-0.9
./configure
編譯make:
安裝make install:
測試:
cmake CMakeList.txt
因爲安裝了git與這個工程可能不對,我們直接使用源碼修改大法,直接定位到代碼給刪掉:
gedit CMakeLists.txt
第7行至63行刪除:
直接刪掉目錄下的緩存文件:CMakeCache.txt,然後繼續:
rm CMakeCache.txt
系統qt5:
而我們使用了另外安裝的qt5,所以依賴需要引入我們自己安裝的qt5上。
使用cmake-gui來指定依賴的qt:
cmake-gui
選擇對應的路徑,然後使用默認unix makefile方式配置:
點擊“Configure”,選擇“Unix Makefiles”方式:
這裏默認使用了系統的:
雖然系統的和我們安裝的是一樣的還是爲了不出錯需要配置以下:
再配置一次:
切入build目錄,並且使用make命令即可:
cd build
make
沒有make install這個,手動移動到/usr/local/bin
cp linuxdeployqt /usr/local/bin/
新建一個工程
然後找個空目錄:
copy程序:
qmake要引入$PATH中(注意:不指定則當前使用的是系統的qmake):
爲了不影響系統,使用腳本引入,每次打包使用之前使用source env.sh引入即可。
#!/bin/sh
QT_DIR=/home/yang/Qt/5.15.2/gcc_64
export PATH=${QT_DIR}/bin:$PATH
export LIB_PATH=${QT_DIR}/lib:$LIB_PATH
export PLUGIN_PATH=${QT_DIR}/plugins:$PLUGIN_PATH
export QML2_PATH=${QT_DIR}/qml:$QML2_PATH
export LD_LIBRARY_PATH=${QT_DIR}/lib:$LD_LIBRARY_PATH
echo $PATH
echo $LIB_PATH
echo $PLUGIN_PATH
echo $QML2_PATH
echo $LD_LIBRARY_PATH
繼續打包:
// 打包命令(用這條還是非常可能缺庫,如libxcb.icccm.so.4各種系統庫)
// linuxdeployqt 可執行程序 -verbose2(不要用這條了,之前ubuntu和麒麟都沒出現該問題,但是centOS8.2出現了卻庫的問題)
// 完整打包命令(完全帶進去了)
linuxdeployqt 可執行程序 -appimage
發現已經打包成功,直接點擊既可以運行了:
爲了進一步驗證,我們弄一個全新的CentOS8.2做測試,裸鏡像:
之前的app3打包拷貝進去:
爲了進一步驗證,我們弄一個全新的CentOS8.2做測試,裸鏡像:
之前的app打包拷貝進去:
跑不起來:
毫無疑問,應該xcb依賴的一些庫沒有導入進來:
export QT_DEBUG_PLUGINS=1
使用linuxdeployqt的時候,使用-appimage