若該文為原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明原文出處
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/131411975文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-502428.html
紅胖子(紅模仿)的博文大全:開發(fā)技術(shù)集合(包含Qt實(shí)用技術(shù)、樹莓派、三維、OpenCV、OpenGL、ffmpeg、OSG、單片機(jī)、軟硬結(jié)合等等)持續(xù)更新中…(點(diǎn)擊傳送門)
國(guó)產(chǎn)麒麟系統(tǒng)、統(tǒng)信UOS系統(tǒng)相關(guān)開發(fā)
上一篇:《統(tǒng)信UOS系統(tǒng)開發(fā)筆記(六):提取在線安裝軟件后,提取其安裝包,部署目標(biāo)機(jī)使用離線軟件包方式安裝軟件》
下一篇:《統(tǒng)信UOS系統(tǒng)開發(fā)筆記(八):在統(tǒng)信UOS上編譯搭建mqtt基礎(chǔ)環(huán)境(版本使用QMQTT::Clinet)》文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-502428.html
前言
??在ubuntu上發(fā)布qt程序相對(duì)還好,使用腳本,但是在統(tǒng)信UOS麒麟上發(fā)布的時(shí)候,因?yàn)殂y河麒麟等不同版本,使用腳本就不太兼容,同時(shí)為了實(shí)現(xiàn)直接點(diǎn)擊應(yīng)用可以啟動(dòng)應(yīng)用的效果,使用linuxdeployqt發(fā)布qt程序。
注意
??本篇文章,最終手動(dòng)結(jié)合幾個(gè)方式成功,花費(fèi)不少時(shí)間研究,推斷是終端直接ldd之后強(qiáng)制進(jìn)入了一個(gè)另外的環(huán)境變量,導(dǎo)致無(wú)法連接成功,也就是,第一層是成功的,第一層的庫(kù)又調(diào)用ldd依賴的這一步的環(huán)境變量被強(qiáng)了。
??但是最后通過(guò)手動(dòng)來(lái)實(shí)現(xiàn)linuxdeplopyqt和編譯配置來(lái)實(shí)現(xiàn)打包部署了。
相關(guān)博客
??《Qt實(shí)用技巧:ubuntu發(fā)布程序打包流程(解決插件xcb加載失敗) 》
??《關(guān)于 QWidget+Qml程序打包到ubuntu時(shí),程序與系統(tǒng)庫(kù)版本不同,編譯時(shí)添加并依賴自帶庫(kù) 的方法》
??《Qt實(shí)用技巧:在CentOS上使用linuxdeployqt打包發(fā)布qt程序》
??《麒麟系統(tǒng)開發(fā)筆記(八):在國(guó)產(chǎn)麒麟系統(tǒng)上使用linuxdeployqt發(fā)布qt程序》
統(tǒng)信UOS系統(tǒng)版本
??系統(tǒng)版本:
??
linuxdeployqt
??Linux部署工具linuxdeployqt將應(yīng)用程序作為輸入,并通過(guò)將應(yīng)用程序使用的資源(如庫(kù)、圖形和插件)復(fù)制到一個(gè)包中使其自包含。結(jié)果包可以作為AppDir或AppImage分發(fā)給用戶,也可以放入交叉分發(fā)包中。它可以作為構(gòu)建過(guò)程的一部分,在CMake、qmake和make等系統(tǒng)中部署用C、C++和其他編譯語(yǔ)言編寫的應(yīng)用程序。當(dāng)用于基于Qt的應(yīng)用程序時(shí),它可以綁定運(yùn)行應(yīng)用程序所需的Qt的特定最小子集。
源碼下載地址
??csdn粉絲0積分下載地址:https://download.csdn.net/download/qq21497936/86803960
??gitcode地址:https://gitcode.net/mirrors/probonopd/linuxdeployqt
linuxdeployqt編譯(統(tǒng)信UOS系統(tǒng))
步驟一:下載解壓
??
步驟二:修改源碼,去掉gcc版本檢查
??找到main.cpp源碼,將這一段(在192行左右)注釋掉(這里通過(guò)看源碼,實(shí)際上是可以通過(guò)配置去控制的(研究源碼發(fā)現(xiàn)的,但是我們不再動(dòng)作了,只是貼出來(lái)):
??
??還是老方法繼續(xù)修改:
vi linuxdeployqt-master/tools/linuxdeployqt/main.cpp
??
步驟三:使用cmake配置
cd linuxdeployqt-master
cmake CMakeLists.txt
??
??因?yàn)榘惭b了git與這個(gè)工程可能不對(duì),我們直接使用源碼修改大法,直接定位到代碼給刪掉:
vi CMakeList.txt
??直接刪掉目錄下的緩存文件:CMakeCache.txt,然后繼續(xù):
??
??繼續(xù)cmake CMakeList.txt
步驟四:配置Qt的依賴環(huán)境
??麒麟系統(tǒng)本身自帶了qt5庫(kù)(未帶開發(fā)相關(guān)的庫(kù)),而我們使用了另外安裝的qt5,所以依賴需要引入我們自己安裝的qt5上。
??為了方便配置,也不影響系統(tǒng)我們裝上cmake的gui版本:
sudo yum install cmake-gui
??
??
cmake-gui
??選擇對(duì)應(yīng)的路徑,然后使用默認(rèn)unix makefile方式配置:
??
??
??
步驟五:生成generate
??
步驟六:編譯make
??切入build目錄,并且使用make命令即可:
make
??
??測(cè)試程序:
??
步驟七:安裝到系統(tǒng)目錄
??沒有make install這個(gè),手動(dòng)移動(dòng)到/usr/local/bin
sudo cp tools/linuxdeployqt/linuxdeployqt /usr/local/bin/
??
步驟八:測(cè)試是否編譯成功
??
linuxdeployqt打包流程(arm看可以,本次pc版本失?。?/h2>
??(PS:虛擬機(jī)打包好之后,退回到裸機(jī)版本,再測(cè)試)
??新建一個(gè)工程
??
??然后,找個(gè)空目錄:
??
??未打包在開發(fā)機(jī)上也可以運(yùn)行(裸機(jī)不行):
??
??這里要將Qt引入環(huán)境,為了不影響系統(tǒng),使用source腳本引入,每次使用之前使用source env.sh引入即可。
touch env.sh
??然后輸入如下(QT_DIR為安裝Qt的路徑):
#!/bin/sh
QT_DIR=/home/yang/Qt5.12.8/5.12.8/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
??
??引入環(huán)境:
??
??下次打包遵循此流程即可,繼續(xù)打包:
??
??(PS:這里是沒有使用sudo進(jìn)行的打包的,可能對(duì)權(quán)限管控比較嚴(yán)格,查看“入坑二”)
??下面使用sudo打包:
sudo linuxdeployqt testDemo -verbose2
??
??上面是Qt5Widget的庫(kù)連接到系統(tǒng)庫(kù)上去了,版本不一樣找不到api
??下面是未打包的testDemo在開發(fā)機(jī)上:
??
??下面是未打包的testDemo在裸機(jī)上:
??
手動(dòng)來(lái)實(shí)現(xiàn)linuxdeployqt打包
步驟一:應(yīng)用放過(guò)去
??
??(這是開發(fā)機(jī),直接運(yùn)行也是可以的)
??
步驟二:創(chuàng)建qt.conf
??這個(gè)文件最重要,他就是調(diào)用testDemo應(yīng)用時(shí)候,先加載然后去搜索庫(kù)路徑的配置,沒有他則走向系統(tǒng)環(huán)境變量了。
touch qt.conf
vi qt.conf
??內(nèi)容,是我們從另外國(guó)產(chǎn)麒麟打包的該文件復(fù)制的,如下:
??
# Generated by linuxdeployqt
# https://github.com/probonopd/linuxdeployqt/
[Paths]
Prefix = ./
Plugins = plugins
Imports = qml
Qml2Imports = qml
??這個(gè)時(shí)候,我們?cè)龠\(yùn)行一次:
??
??路徑從本地開始找了。
步驟三:實(shí)現(xiàn)其他三個(gè)文件夾依賴的拷貝
??
ls -l
cp /home/yang/Qt5.12.8/5.12.8/gcc_64/translations/ . -rf
cp /home/yang/Qt5.12.8/5.12.8/gcc_64/plugins/ . -rf
cp /home/yang/Qt5.12.8/5.12.8/gcc_64/lib/ . -rf
ls -lh
??
??測(cè)試本機(jī)可運(yùn)行了:
??
??(PS:這里是全部copy了庫(kù),沒有進(jìn)行依賴裁剪的,暫時(shí)不管了,花費(fèi)時(shí)間遠(yuǎn)超預(yù)期了)
步驟四:打包放到裸機(jī)上
??因?yàn)闆]有裁剪,所以包比較大:
cd ..
tar cvf outManual.tar outManual
ls -l outManual.tar
??
??拷貝到裸機(jī)上去。
??
??
步驟五:裸機(jī)上測(cè)試運(yùn)行(失?。?/h3>
??還是失敗,如下:
??
??這還是之前一樣,libQt5Widget.so.5依賴libQt5Core.so.5,前面是用當(dāng)前配置的,然后庫(kù)的依賴庫(kù)就強(qiáng)制引入到了/usr/lib64,跟之前l(fā)inuxdeployqt打包一樣的問題。
??
??然后有個(gè)念頭,于是嘗試加上LD_LIBRARY_PATH測(cè)試,可以運(yùn)行成功,具體查看“入坑四”。
步驟六:編譯時(shí)引入運(yùn)行時(shí)路徑pro配置QMAKE_RPATHDIR
??為了不在運(yùn)行時(shí)額外添加環(huán)境變量,為了打包不出現(xiàn)xcb問題,還得修改一下.pro文件如下圖:
# 這里是添加運(yùn)行應(yīng)用的時(shí)候的運(yùn)行包,此處避免額外設(shè)置LD_LIBRARY_PATH
QMAKE_RPATHDIR = ./lib
??
??編譯出來(lái),單獨(dú)將testDemo2放置到原來(lái)的部署裸機(jī)上:
??
??最終,直接點(diǎn)擊可以運(yùn)行成功。
入坑
入坑一:編譯linuxdeployqt的依賴Qt路徑問題
問題
??開始編譯的時(shí)候,讓其依賴了系統(tǒng),直接導(dǎo)致就算引入了其他qt的環(huán)境變量,打包也是依賴系統(tǒng),直接不打包
??
原因
??懷疑是跟編譯linuxdeployqt的依賴有關(guān),所以重做一遍自己安裝Qt的cmake。
解決
??重做一遍自己安裝Qt的cmake后編譯,也還是一樣的。
??
入坑二:linuxdeployqt不復(fù)制的問題
問題
??如前面的入坑,就是不復(fù)制,與編譯依賴沒關(guān)系。
嘗試
??沒有辦法,直接干linuxdeployqt的main.cpp的源碼:
??1.先調(diào)試哪里沒有打印,每次修改源碼重新編譯之后,部署再打包看輸出結(jié)果。??(PS:發(fā)現(xiàn)qDebug()不輸出,輸出的是qInfo())
??
??
??
??將所有LogError換為qInfo(),如下圖:
??
??
??還是不行:
??
??繼續(xù):
??
??棘手的問題:
??
??至此可以確認(rèn)是兼容性問題,這個(gè)問題比較棘手,短期內(nèi)調(diào)不好了。
解決
??Linuxdeployqt方式暫未解決,可以換個(gè)linuxdeployqt的版本,也許不同的uos版本也不會(huì)又這個(gè)問題了,很奇怪連LogError和qDebug都不出來(lái)。
??后續(xù),第二天突然想到是否需要sodu權(quán)限,嘗試了下,確實(shí)是的:
??
??所以又重做,使用sudo來(lái)打包了。
入坑三:依賴鏈接庫(kù)存在錯(cuò)誤
問題
??
??這是和系統(tǒng)的沖突了。
??編譯的時(shí)候也是使用的安裝包的:
??
原因
??
??
??無(wú)解,qmake路徑和環(huán)境變相也都沒有問題
??
??檢查linuxdeployqt
??
嘗試1
??拍快照,然后目錄下的所有/usr/lib64/Qt5*刪除,首先檢查系統(tǒng)是否正常啟用,再打包嘗試。
sudo rm /usr/lib64/libQt5*
??重啟,確實(shí),系統(tǒng)起不來(lái)了,系統(tǒng)依賴Qt5.11下的庫(kù)。
??
??所以不能刪除,此路不通。
嘗試2
??拍快照,然后將安裝的Qt5庫(kù)copy過(guò)去,首先檢查系統(tǒng)是否正常啟用,再打包嘗試。
??執(zhí)行copy指令,直接立即黑屏,此路不同。
??所以,/usr/lib64下的庫(kù)是不能動(dòng)的。
??
??這里懷疑,從進(jìn)入終端開始就進(jìn)入了固定的優(yōu)先環(huán)境變量,只是推測(cè),目前l(fā)inuxdeployqt又花費(fèi)半天,暫時(shí)仍然無(wú)解。
解決方法(有點(diǎn)偏門,失?。?/h4>
??找不到一個(gè)庫(kù)就刪掉一個(gè)庫(kù),此時(shí)系統(tǒng)是已經(jīng)將庫(kù)加載進(jìn)內(nèi)存運(yùn)行,是不影響正在運(yùn)行的系統(tǒng),但是無(wú)法重啟,如下:
sudo linuxdeployqt testDemo -verbose2
sudo rm /usr/lib64/libQt5Gui.so*
??
??
sudo linuxdeployqt testDemo -verbose2
sudo rm /usr/lib64/libQt5Core.so*
??
sudo linuxdeployqt testDemo -verbose2
sudo cp /home/yang/Qt5.12.8/5.12.8/gcc_64/lib/libicuuc.so* /usr/lib64/
??
sudo linuxdeployqt testDemo -verbose2
sudo cp /home/yang/Qt5.12.8/5.12.8/gcc_64/lib/libicudata.so* /usr/lib64/
??
sudo linuxdeployqt testDemo -verbose2
sudo yum install patchelf
sudo linuxdeployqt testDemo -verbose2
??
??
??可以,uos你贏了,我放棄了?。。?/p>
入坑四:手動(dòng)qt.conf模仿部署還是強(qiáng)制路徑切換
問題
??
原因
??分析該系統(tǒng)第二次搜索庫(kù),總是會(huì)引入到/usr/lib64,這個(gè)問題很操蛋,從一開始linuxdeployqt打包不行就是這個(gè)根本原因。
解決
??直接在編譯的時(shí)候,最優(yōu)先的方式,讓應(yīng)用去運(yùn)行時(shí)先依賴相對(duì)路徑,而不是去依靠運(yùn)行時(shí)的環(huán)境變量和配置文件了。
??pro加入配置文件:
# 這里是添加運(yùn)行應(yīng)用的時(shí)候的運(yùn)行包,此處避免額外設(shè)置LD_LIBRARY_PATH
QMAKE_RPATHDIR = ./lib
??點(diǎn)擊應(yīng)用運(yùn)氣的時(shí)候,應(yīng)用自身會(huì)先依賴./lib下的庫(kù)查找。
上一篇:《統(tǒng)信UOS系統(tǒng)開發(fā)筆記(六):提取在線安裝軟件后,提取其安裝包,部署目標(biāo)機(jī)使用離線軟件包方式安裝軟件》
下一篇:《統(tǒng)信UOS系統(tǒng)開發(fā)筆記(八):在統(tǒng)信UOS上編譯搭建mqtt基礎(chǔ)環(huán)境(版本使用QMQTT::Clinet)》
若該文為原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明原文出處
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/131411975
到了這里,關(guān)于統(tǒng)信UOS系統(tǒng)開發(fā)筆記(七):在統(tǒng)信UOS系統(tǒng)上使用linuxdeployqt發(fā)布qt程序的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!