查看完整版本: [-- 【Qt5 Ubuntu動態鏈結庫發佈配置問題】 --]

QTCN开发网 -> Qt安装与发布 -> 【Qt5 Ubuntu動態鏈結庫發佈配置問題】 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

yishiang0217 2017-07-12 10:24

【Qt5 Ubuntu動態鏈結庫發佈配置問題】

各位板友大家好,

我想請問Qt5於Ubuntu下發布檔案(含動態庫)至另一台沒有裝Qt庫的問題,
為了測試,我用Qt Creator建立了一個空白的QMainWindow專案,
直接進行編譯,於Qt Creator執行能成功,而於command line執行無法成功,
於是我參照官方文檔,建立.sh檔後執行.sh檔即可成功於有安裝qt的Ubuntu執行。
http://doc.qt.io/qt-5/linux-deployment.html
(文檔中說明預設名platforms需於執行程序目錄的子目錄且包含libqxcb.so,
而.sh檔是直接拷貝官方內容,並置於執行程序同層級目錄。)

但將執行目錄中的檔案打包至另一台虛擬機的Ubuntu中,
(於打包前有用ldd查詢程序所需動態庫,並複製至執行目錄的子目錄lib下)
執行.sh檔卻出現了..
"it could not find or load the qt platform plugin xcb in"
類似的訊息,用ldd查詢執行檔,所有所需的動態庫皆可於執行目錄的子目錄找到,
(有於.pro檔設定rpath:QMAKE_LFLAGS += "-Wl,--rpath,\'\$$ORIGIN/lib\'"
不論設不設定都得到相同的錯誤訊息)
懇請板上先進給予詳細指引。

以下是我的執行程序目錄結構:
MyApp/
├── lib
│ ├── libicudata.so.56
│ ├── libicui18n.so.56
│ ├── libicuuc.so.56
│ ├── libQt5Core.so.5
│ ├── libQt5DBus.so.5
│ ├── libQt5Gui.so.5
│ └── libQt5XcbQpa.so.5
│ (以下省略..)

├── plugins(/Qt/ggc_64/plugins資料夾完整複製)
│ ├── platforms

├── platforms(/Qt/ggc_64/plugins/platforms/資料夾完整複製)
│ ├── libqxcb.so


├── MyApp(可執行文件)

├── MyApp.sh

若有板上先進知道如何解決問題,還請不吝賜教,謝謝^^
--
曾基於上面的後續嘗試加入qt.conf和MyApp可執行文件同級目錄,
內容為:
[Paths]
Prefix = ./
Libraries = lib
Plugins = plugins

也是不行,不曉得是不是沒有讀到。

笑颜 2017-07-13 09:07
你再试试,看看ldd libqxcb.so,我记得好像这个库还需要依赖其他库,因为我之前也是在这里折磨了很久!

笑颜 2017-07-13 09:11
比较高的版本还需要:(我是5.9.0)

libQt5XcbQpa.so.5

├── xcbglintegrations
│ ├── libqxcb-glx-integration.so

yishiang0217 2017-07-13 10:40
笑颜:你再试试,看看ldd libqxcb.so,我记得好像这个库还需要依赖其他库,因为我之前也是在这里折磨了很久! (2017-07-13 09:07) 

笑顏大大您好,

首先謝謝您的回覆,於目標平台Ubuntu上進行試驗(沒qt.conf文件)還是失敗,以下將進行我的操作說明:
--
1. ldd Demo 提示無缺檔案
(以下節錄部份訊息...)
james@james-virtual-machine:~/下載/Demo9$ ldd Demo
    linux-vdso.so.1 =>  (0x00007ffd196d8000)
    libVLCQtCore.so.1.1 => /home/james/下載/Demo9/./lib/libVLCQtCore.so.1.1 (0x00007f6616bc9000)
    libVLCQtWidgets.so.1.1 => /home/james/下載/Demo9/./lib/libVLCQtWidgets.so.1.1 (0x00007f66169b1000)
    libQt5Widgets.so.5 => /home/james/下載/Demo9/./lib/libQt5Widgets.so.5 (0x00007f6616180000)
    libQt5Gui.so.5 => /home/james/下載/Demo9/./lib/libQt5Gui.so.5 (0x00007f66159d2000)
    libQt5Core.so.5 => /home/james/下載/Demo9/./lib/libQt5Core.so.5 (0x00007f6615298000)
    libstdc++.so.6 => /home/james/下載/Demo9/./lib/libstdc++.so.6 (0x00007f6614f15000)
    libgcc_s.so.1 => /home/james/下載/Demo9/./lib/libgcc_s.so.1 (0x00007f6614cff000)
    (下面省略...)


2. ldd ./platforms/libqxcb.so 有提示缺少檔案
(以下節錄部份訊息)
james@james-virtual-machine:~/下載/Demo9/platforms$ ldd libqxcb.so
./libqxcb.so: /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5: version `Qt_5_PRIVATE_API' not found (required by ./libqxcb.so)
    linux-vdso.so.1 =>  (0x00007ffcb4fca000)
    libQt5XcbQpa.so.5 => /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5 (0x00007f5f8a6fd000)
    libQt5DBus.so.5 => /usr/lib/x86_64-linux-gnu/libQt5DBus.so.5 (0x00007f5f8a67f000)
    libgthread-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0 (0x00007f5f8a47c000)
    libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f5f8a16b000)
    libfontconfig.so.1 => /usr/lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007f5f89f28000)
    libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f5f89c7d000)
    libQt5Gui.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 (0x00007f5f894cf000)
    libQt5Core.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 (0x00007f5f88d95000)
    libGL.so.1 => /usr/lib/x86_64-linux-gnu/mesa/libGL.so.1 (0x00007f5f88b20000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f5f88903000)
    libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f5f885c9000)
    libX11-xcb.so.1 => /usr/lib/x86_64-linux-gnu/libX11-xcb.so.1 (0x00007f5f883c6000)
    libXi.so.6 => /usr/lib/x86_64-linux-gnu/libXi.so.6 (0x00007f5f881b6000)
    libSM.so.6 => /usr/lib/x86_64-linux-gnu/libSM.so.6 (0x00007f5f87fae000)
    libICE.so.6 => /usr/lib/x86_64-linux-gnu/libICE.so.6 (0x00007f5f87d93000)
    libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f5f87b71000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f5f877ef000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f5f874e5000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f5f872cf000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5f86f05000)
    libxcb-render-util.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-render-util.so.0 (0x00007f5f86d00000)
    libxcb-render.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-render.so.0 (0x00007f5f86af6000)
    libxcb-image.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-image.so.0 (0x00007f5f868f1000)
    libxcb-icccm.so.4 => /usr/lib/x86_64-linux-gnu/libxcb-icccm.so.4 (0x00007f5f866eb000)
    libxcb-sync.so.1 => /usr/lib/x86_64-linux-gnu/libxcb-sync.so.1 (0x00007f5f864e4000)
    libxcb-xfixes.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-xfixes.so.0 (0x00007f5f862dc000)
    libxcb-shm.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-shm.so.0 (0x00007f5f860d7000)
    libxcb-randr.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-randr.so.0 (0x00007f5f85ec9000)
    libxcb-shape.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-shape.so.0 (0x00007f5f85cc5000)
    libxcb-keysyms.so.1 => /usr/lib/x86_64-linux-gnu/libxcb-keysyms.so.1 (0x00007f5f85ac1000)
    libxcb-xkb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb-xkb.so.1 (0x00007f5f858a6000)
    libxkbcommon-x11.so.0 => /usr/lib/x86_64-linux-gnu/libxkbcommon-x11.so.0 (0x00007f5f8569e000)
    libxkbcommon.so.0 => /usr/lib/x86_64-linux-gnu/libxkbcommon.so.0 (0x00007f5f8545e000)
    libdbus-1.so.3 => /lib/x86_64-linux-gnu/libdbus-1.so.3 (0x00007f5f85212000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f5f84fa1000)
    libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f5f84d78000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f5f84b5e000)
    libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007f5f84938000)
    libicui18n.so.56 => not found
    libicuuc.so.56 => not found
    libicudata.so.56 => not found
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5f84733000)
    (下面省略...)

   嘗試將libicui18n.so.56   libicuuc.so.56 libicudata.so.56 放置於./platforms/目錄下,以及將libQt5XcbQpa.so.5拷貝至/usr/lib/x86_64-linux-gnu/目錄下執行./Demo皆失敗,其中libQt5XcbQpa.so.5第一行跳錯誤訊息,但下面的libQt5XcbQpa.so.5有找到,這是怎麼回事~暈~

3. ldd /Plugins/Platforms/libqxcb.so 有提示缺少檔案
(以下節錄部份訊息)
james@james-virtual-machine:~/下載/Demo9/plugins/platforms$ ldd libqxcb.so
./libqxcb.so: /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5: version `Qt_5_PRIVATE_API' not found (required by ./libqxcb.so)
    linux-vdso.so.1 =>  (0x00007ffe15d8a000)
    libQt5XcbQpa.so.5 => /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5 (0x00007ff89edbb000)
    libQt5DBus.so.5 => /usr/lib/x86_64-linux-gnu/libQt5DBus.so.5 (0x00007ff89ed3d000)
    libgthread-2.0.so.0 => /home/james/下載/Demo9/plugins/platforms/./../../lib/libgthread-2.0.so.0 (0x00007ff89eb3a000)
    libglib-2.0.so.0 => /home/james/下載/Demo9/plugins/platforms/./../../lib/libglib-2.0.so.0 (0x00007ff89e829000)
    libfontconfig.so.1 => /usr/lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007ff89e5e6000)
    libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007ff89e33b000)
    libQt5Gui.so.5 => /home/james/下載/Demo9/plugins/platforms/./../../lib/libQt5Gui.so.5 (0x00007ff89db8d000)
    libQt5Core.so.5 => /home/james/下載/Demo9/plugins/platforms/./../../lib/libQt5Core.so.5 (0x00007ff89d453000)
    libGL.so.1 => /home/james/下載/Demo9/plugins/platforms/./../../lib/libGL.so.1 (0x00007ff89d1de000)
    libpthread.so.0 => /home/james/下載/Demo9/plugins/platforms/./../../lib/libpthread.so.0 (0x00007ff89cfc1000)
    libX11.so.6 => /home/james/下載/Demo9/plugins/platforms/./../../lib/libX11.so.6 (0x00007ff89cc87000)
    libX11-xcb.so.1 => /home/james/下載/Demo9/plugins/platforms/./../../lib/libX11-xcb.so.1 (0x00007ff89ca84000)
    libXi.so.6 => /usr/lib/x86_64-linux-gnu/libXi.so.6 (0x00007ff89c874000)
    libSM.so.6 => /usr/lib/x86_64-linux-gnu/libSM.so.6 (0x00007ff89c66c000)
    libICE.so.6 => /usr/lib/x86_64-linux-gnu/libICE.so.6 (0x00007ff89c451000)
    libxcb.so.1 => /home/james/下載/Demo9/plugins/platforms/./../../lib/libxcb.so.1 (0x00007ff89c22f000)
    libstdc++.so.6 => /home/james/下載/Demo9/plugins/platforms/./../../lib/libstdc++.so.6 (0x00007ff89bead000)
    libm.so.6 => /home/james/下載/Demo9/plugins/platforms/./../../lib/libm.so.6 (0x00007ff89bba3000)
    libgcc_s.so.1 => /home/james/下載/Demo9/plugins/platforms/./../../lib/libgcc_s.so.1 (0x00007ff89b98d000)
    libc.so.6 => /home/james/下載/Demo9/plugins/platforms/./../../lib/libc.so.6 (0x00007ff89b5c3000)
    libxcb-render-util.so.0 => /usr/lib/x86_64-linux-gnu/libxcb-render-util.so.0
   (下面省略...)
      libicui18n.so.56   libicuuc.so.56 libicudata.so.56自動有找到,其中libQt5XcbQpa.so.5第一行跳錯誤訊息,但下面的libQt5XcbQpa.so.5有找到,不過依舊無法執行程序。
--
懇請Joey大神再提供方向指引,謝謝您>//<

yishiang0217 2017-07-13 10:49
笑颜:比较高的版本还需要:(我是5.9.0)
libQt5XcbQpa.so.5
├── xcbglintegrations
....... (2017-07-13 09:11)

笑顏大大您好,

呈上一則回覆您的留言後,我緊接著又將/home/james/Qt/5.9.1/gcc_64/plugins/xcbglintegrations/資料夾完整複製於MyApp/目錄下(與MyApp執行檔同層),依然是不行(無qt.conf)。

想請問您編輯時有於.pro檔做了哪些操作嗎?(看執行文件鏈結的依賴庫,我的-rpath應該是設定正確的?)  或是您有無設定qt.conf呢? ./platforms和./plugins/platforms到底哪個才真的有用? (看官方文檔是說沒設定qt.conf的話,預設會去抓取可執行程序同級目錄的platforms..),您後來是直接執行可執行文件成功?還是執行.sh檔成功呢?

問題有點多,不好意思再麻煩笑顏大大了,謝謝您。

p.s. 我是用5.9.1,這個地方折騰了好久,始終無法解決... 焦慮阿

笑颜 2017-07-13 10:49
还有个笨办法,你把QT/lib下所有库都拷贝过去,然后一个一个的删除,发现删除不能启动了,那就是需要依赖的,把它还原,再删其他的,最后剩下来的就是需要的。[attachment=17465] 这几个单独需要依赖的也先添加进去。

笑颜 2017-07-13 10:50
另外,发布QML程序才是最坑的!

笑颜 2017-07-13 10:55
yishiang0217:笑顏大大您好,
呈上一則回覆您的留言後,我緊接著又將/home/james/Qt/5.9.1/gcc_64/plugins/xcbglintegrations/資料夾完整複製於MyApp/目錄下(與MyApp執行檔同層),依然是不行(無qt.conf)。
....... (2017-07-13 10:49) 

我并没有修改pro,也没添加qt.conf,虽然有试过,但最终还是不需要。(另外,对于自己编译的QT,出现上面的问题我并没有解决办法,因为我觉得自己编译的QT有些库的依赖关系并没有处理好,所以,会在部署到不同的机器上查找底层的库,但是不同机器的库可能版本不一样,导致引用失败)

yishiang0217 2017-07-13 11:07
笑颜:还有个笨办法,你把QT/lib下所有库都拷贝过去,然后一个一个的删除,发现删除不能启动了,那就是需要依赖的,把它还原,再删其他的,最后剩下来的就是需要的。[图片] 这几个单独需要依赖的也先添加进去。
 (2017-07-13 10:49) 

很高興收到您的回覆,您的意思是要我把/home/james/Qt/5.9.1/gcc_64/lib目錄下的所有檔案拷貝到可執行文件目錄下的lib目錄嗎?

看您提供的圖片,這4個資料夾是放在可執行文件的同級目錄嗎?

我好像缺少了imageformats目錄及qml目錄(方才才添加了xcbglintegrations目錄),我等等馬上試試,並且把原來的/plugins/platforms砍掉,希望能成功!謝謝您!

yishiang0217 2017-07-13 11:08
笑颜:另外,发布QML程序才是最坑的! (2017-07-13 10:50) 

唉... 我暫時還沒接觸QML,想到就蛋疼~ 這個都搞不定,不敢想QML~

yishiang0217 2017-07-13 11:26
笑颜:我并没有修改pro,也没添加qt.conf,虽然有试过,但最终还是不需要。(另外,对于自己编译的QT,出现上面的问题我并没有解决办法,因为我觉得自己编译的QT有些库的依赖关系并没有处理好,所以,会在部署到不同的机器上查找底层的库,但是不同机器的库可能版本不一样,导致引用失 .. (2017-07-13 10:55)

謝謝您的回覆,真是太神奇了..
您沒設定-rpath的話,Qt/lib/內的文件您是放在與可執行文件同層級目錄嗎?
我其實有用別人寫好的Script拷貝相依檔案,ldd Demo是沒問題的,
但是libqxcb.so的相依庫就沒另外特別複製。
--
#!/bin/sh


    DIR="$( cd "$( dirname "$0"  )" && pwd  )"

    exe="$DIR/Demo" #发布的程序名称
    des=$DIR/lib #你的路径

    deplist=$(ldd $exe | awk  '{if (match($3,"/")){ printf("%s "),$3 } }')
    sudo cp $deplist $des
--

其實只要可以穩定執行,沒產生memory leak就可以了XDDD
p.s. 我當初是至官方下載.run直接執行,沒有自己編譯Qt文件噢。且編輯平台與發布平台都是Ubuntu 16.04 LTS,也都是Virtual Box建的環境.





yishiang0217 2017-07-13 12:11
笑颜:还有个笨办法,你把QT/lib下所有库都拷贝过去,然后一个一个的删除,发现删除不能启动了,那就是需要依赖的,把它还原,再删其他的,最后剩下来的就是需要的。[图片] 这几个单独需要依赖的也先添加进去。
 (2017-07-13 10:49) 

笑顏大大,非常感謝您!!真的非常感謝!!解決了我近2週以來的困擾,查看了美國國外的文章無數...各種方法充斥,就你的方法最直觀適合新手,接下來我可以繼續開發程序了^^


查看完整版本: [-- 【Qt5 Ubuntu動態鏈結庫發佈配置問題】 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled