ubuntu 升級QT版本后,在新機上發布QT程序報錯:qt.qpa.plugin: Could not find the Qt platform plugin “xcb” in “”
原創啊拉丁的魚 最后發布於2019-11-25 16:32:51 閱讀數 511 收藏
展開
本地原本使用的QT版本是5.11,最近更新成了5.13.2;在本地編譯、運行一切正常;發布release版本到新的ubuntu上;由於在新機器上沒有安裝QT,所以發布的時候通過ldd導致出程序的依賴庫,把這些依賴庫和程序放在同一目錄一起拷貝到新機器上,初次運行需要指定庫目錄,否則會報找不到庫文件的錯誤:
指定程序執行的庫文件目錄,在終端輸入指令:
export LD_LIBRARY_PATH='/home/rdd/pp':$LD_LIBRARY_PATH
然后再重新運行程序,結果運行時出現錯誤:
猜測是運行依賴庫不全導致,但是一開始通過ldd導出的依賴庫在編譯程序的機器上已經是完整的,所以這里應該是內部庫的二次依賴導致。啟動QT_DEBUG_PLUGINS,查看程序的執行過程,分析是哪部分缺失。也可以通過設置環境變量的方式,不過如果只是調bug,只需要在終端輸入,讓其一次性顯示即可,在終端輸入指令:
export QT_DEBUG_PLUGINS=1
然后再重新啟動發布的程序,發現多了一點打印信息:
提示在程序的執行目錄下,企圖加載platforms的相關庫,以打印相關的庫調用信息,但是這里並沒有相關打印。是因為當前缺少platforms目錄的庫文件導致。
從原機器上(裝了QT5.13.2)的QT安裝目錄中,把該目錄以及其內部所有文件完整拷貝到新機器上(xftp拷貝),我的安裝在OPT目錄,里面的庫文件只有12個,需要把完整目錄一起拷貝到新機器的程序同目錄下,完整目錄如下:
然后再回到新機器上,重新執行程序(前面的設置步驟要先設置好),然后就有完整的debug信息出來了
QFactoryLoader::QFactoryLoader() checking directory path "/home/rdd/pp/platforms" ...
QFactoryLoader::QFactoryLoader() looking at "/home/rdd/pp/platforms/libqeglfs.so"
Found metadata in lib /home/rdd/pp/platforms/libqeglfs.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"eglfs"
]
},
"archreq": 0,
"className": "QEglFSIntegrationPlugin",
"debug": false,
"version": 331008
}
Got keys from plugin meta data ("eglfs")
QFactoryLoader::QFactoryLoader() looking at "/home/rdd/pp/platforms/libqlinuxfb.so"
Found metadata in lib /home/rdd/pp/platforms/libqlinuxfb.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"linuxfb"
]
},
"archreq": 0,
"className": "QLinuxFbIntegrationPlugin",
"debug": false,
"version": 331008
}
Got keys from plugin meta data ("linuxfb")
QFactoryLoader::QFactoryLoader() looking at "/home/rdd/pp/platforms/libqminimal.so"
Found metadata in lib /home/rdd/pp/platforms/libqminimal.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"minimal"
]
},
"archreq": 0,
"className": "QMinimalIntegrationPlugin",
"debug": false,
"version": 331008
}
Got keys from plugin meta data ("minimal")
QFactoryLoader::QFactoryLoader() looking at "/home/rdd/pp/platforms/libqminimalegl.so"
Found metadata in lib /home/rdd/pp/platforms/libqminimalegl.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"minimalegl"
]
},
"archreq": 0,
"className": "QMinimalEglIntegrationPlugin",
"debug": false,
"version": 331008
}
Got keys from plugin meta data ("minimalegl")
QFactoryLoader::QFactoryLoader() looking at "/home/rdd/pp/platforms/libqoffscreen.so"
Found metadata in lib /home/rdd/pp/platforms/libqoffscreen.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"offscreen"
]
},
"archreq": 0,
"className": "QOffscreenIntegrationPlugin",
"debug": false,
"version": 331008
}
Got keys from plugin meta data ("offscreen")
QFactoryLoader::QFactoryLoader() looking at "/home/rdd/pp/platforms/libqvnc.so"
Found metadata in lib /home/rdd/pp/platforms/libqvnc.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"vnc"
]
},
"archreq": 0,
"className": "QVncIntegrationPlugin",
"debug": false,
"version": 331008
}
Got keys from plugin meta data ("vnc")
QFactoryLoader::QFactoryLoader() looking at "/home/rdd/pp/platforms/libqwayland-egl.so"
Found metadata in lib /home/rdd/pp/platforms/libqwayland-egl.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"wayland-egl"
]
},
"archreq": 0,
"className": "QWaylandEglPlatformIntegrationPlugin",
"debug": false,
"version": 331008
}
Got keys from plugin meta data ("wayland-egl")
QFactoryLoader::QFactoryLoader() looking at "/home/rdd/pp/platforms/libqwayland-generic.so"
Found metadata in lib /home/rdd/pp/platforms/libqwayland-generic.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"wayland"
]
},
"archreq": 0,
"className": "QWaylandIntegrationPlugin",
"debug": false,
"version": 331008
}
Got keys from plugin meta data ("wayland")
QFactoryLoader::QFactoryLoader() looking at "/home/rdd/pp/platforms/libqwayland-xcomposite-egl.so"
Found metadata in lib /home/rdd/pp/platforms/libqwayland-xcomposite-egl.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"wayland-xcomposite-egl"
]
},
"archreq": 0,
"className": "QWaylandXCompositeEglPlatformIntegrationPlugin",
"debug": false,
"version": 331008
}
Got keys from plugin meta data ("wayland-xcomposite-egl")
QFactoryLoader::QFactoryLoader() looking at "/home/rdd/pp/platforms/libqwayland-xcomposite-glx.so"
Found metadata in lib /home/rdd/pp/platforms/libqwayland-xcomposite-glx.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"wayland-xcomposite-glx"
]
},
"archreq": 0,
"className": "QWaylandXCompositeGlxPlatformIntegrationPlugin",
"debug": false,
"version": 331008
}
Got keys from plugin meta data ("wayland-xcomposite-glx")
QFactoryLoader::QFactoryLoader() looking at "/home/rdd/pp/platforms/libqwebgl.so"
Found metadata in lib /home/rdd/pp/platforms/libqwebgl.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"webgl"
]
},
"archreq": 0,
"className": "QWebGLIntegrationPlugin",
"debug": false,
"version": 331008
}
Got keys from plugin meta data ("webgl")
QFactoryLoader::QFactoryLoader() looking at "/home/rdd/pp/platforms/libqxcb.so"
Found metadata in lib /home/rdd/pp/platforms/libqxcb.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"xcb"
]
},
"archreq": 0,
"className": "QXcbIntegrationPlugin",
"debug": false,
"version": 331008
}
Got keys from plugin meta data ("xcb")
Cannot load library /home/rdd/pp/platforms/libqxcb.so: (/usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5: version `Qt_5_PRIVATE_API' not found (required by /home/rdd/pp/platforms/libqxcb.so))
QLibraryPrivate::loadPlugin failed on "/home/rdd/pp/platforms/libqxcb.so" : "Cannot load library /home/rdd/pp/platforms/libqxcb.so: (/usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5: version `Qt_5_PRIVATE_API' not found (required by /home/rdd/pp/platforms/libqxcb.so))"
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl, xcb.
已放棄 (核心已轉儲)
直接跳到log的最后,發現了出現錯誤的地方:
Cannot load library /home/rdd/pp/platforms/libqxcb.so: (/usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5: version `Qt_5_PRIVATE_API' not found (required by /home/rdd/pp/platforms/libqxcb.so))
缺失庫文件:libQt5XcbQpa.so.5。
知道明確缺失哪個文件就好辦了:再回到原機器上(裝了QT5.13.2),在QT安裝目錄下:
拷貝到新機器的程序執行目錄下,然后再啟動程序,就沒有再報錯了!到此,這個xcb的報錯問題已經成功解決!
需要注意的問題:
另外需要特別注意一個問題,就是這些.so.5結尾的文件,在原機器上,都只是一個鏈接文件,它鏈接到一個目標文件,這個目標文件才是真正的庫文件,如果只是拷貝一個鏈接文件過去,是無法運行的。
或者也可以拷貝原庫文件,再用創建鏈接的方式創建一個。比如下面的指令會創建一個指向庫文件so.5.13.2的鏈接so.5。
ln -s /opt/QT5.13.2/5.13.2/gcc_64/lib/libQt5XcbQpa.so.5.13.2 libQt5XcbQpa.so.5
當然,so.5.13.2拷貝到新機器上之后,指令中源文件的地址要適當改一下。指令運行完之后,在新機器的執行目錄下,會同時存在so.5.13.2和so.5兩個文件。
補充:出現以下報錯的也同樣的問題,上述解決思路可以解決
————————————————
版權聲明:本文為CSDN博主「啊拉丁的魚」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/AAA123524457/article/details/103239301
linux下程序打包發布
原創HGT-teluoyi 最后發布於2018-10-30 19:05:53 閱讀數 2361 收藏
展開
程序以test為例:
1. QtCreate使用Release版本編譯
2. 從可運行程序的文件中拿出可執行文件,例:test
3. 終端下使用ldd命令查看需要的連接庫,例:ldd test
4. 把ldd查詢到的所有需要的庫導出
這里提供一個腳本將ldd打印出來的依賴庫復制到指定路徑:
#!/bin/sh
exe="test" #發布的程序名稱
des="./lib" #你的路徑
deplist=$(ldd $exe | awk '{if (match($3,"/")){ printf("%s "),$3 } }')
cp $deplist $des
5. 編寫.sh文檔 並將它放在與步驟4同一目錄下(.sh文件命名必須與可執行文件名字一樣例:可執行文件名 test, .sh 文件名為 test.sh)
.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 "$@"
6. 執行這個.sh文件:
可能因為不行執行需更改權限:
chmod +x test.sh
————————————————
版權聲明:本文為CSDN博主「HGT-teluoyi」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u013305101/java/article/details/83547059