2017-05-28 101 views
0

我有一個使用Qt 5.8創建的應用程序。該應用程序是在Ubuntu 16.04上開發的。Linux上的Qt 5.8(Ubuntu 16.04)應用程序部署

運行ldd app_name後,我可以看到庫中的應用程序使用:

linux-vdso.so.1 => (0x00007ffe16bef000) 
libmysqlclient.so.20 => /usr/lib/x86_64-linux-gnu/libmysqlclient.so.20 (0x00007f1f455b0000) 
libQt5Widgets.so.5 => /home/r0ng/Qt/5.8/gcc_64/lib/libQt5Widgets.so.5 (0x00007f1f44d7f000) 
libQt5Gui.so.5 => /home/Qt/5.8/gcc_64/lib/libQt5Gui.so.5 (0x00007f1f445e3000) 
libQt5Core.so.5 => /home/Qt/5.8/gcc_64/lib/libQt5Core.so.5 (0x00007f1f43ec3000) 
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f1f43b41000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f1f4392a000) 
... ... 

現在,我想我的部署應用在其他Linux機器。 我檢查的第一件事是官方文檔: http://doc.qt.io/qt-5/linux-deployment.html

我發現我沒有配置腳本。

find -type f -name "configure*" 
./Docs/Qt-5.8/qtgamepad/images/configuregamepadbuttons-example.png 
./Docs/Qt-5.8/qtdoc/configure-options.html 
./Examples/Qt-5.8/gamepad/configureButtons/configureButtons.pro 
./Examples/Qt-5.8/gamepad/configureButtons/doc/images/configuregamepadbuttons-example.png 
./5.8/gcc_64/mkspecs/features/configure_base.prf 
./5.8/gcc_64/mkspecs/features/configure.prf 
./5.8/android_armv7/mkspecs/features/configure_base.prf 
./5.8/android_armv7/mkspecs/features/configure.prf 

是否需要以特定方式安裝Qt才能獲取配置腳本?我也嘗試在Qt Maintenace工具中查找腳本。但沒有。

另一個嘗試是基於此線程 Deployment of QT apps on linux。看起來Qt項目文件(* .pro)允許開發人員將所有動態庫複製到應用程序的當前工作目錄。但我不知道如何設定價值ORIGIN。在這種情況下,-rplrpath會做什麼?

任何人都知道如何讓Qt從當前工作目錄加載* .so文件?

感謝

+0

「我需要以特定方式安裝Qt才能獲得配置腳本嗎?」我假設你需要從源代碼構建和安裝Qt,而不是安裝預構建的二進制包,以便擁有configure腳本。這是* nix軟件的慣例。 – MrEricSir

+0

您可以看看[部署包](https://stackoverflow.com/documentation/debian/9925/create-a-debian-package#t=201705290824497346076) –

回答

1

configure腳本存在,當您從源構建Qt和可能你並不需要這一點。要從當前工作目錄加載共享庫,您需要將LD_LIBRARY_PATH env變量指向共享庫所在的目錄。您可以在官方Qt文檔Linux Deployment中找到一個腳本示例。例如我用我的部署,這個修改後的腳本:

#!/bin/sh 
dirname=`dirname $0` 
tmp="${dirname#?}" 

if [ "${dirname%$tmp}" != "/" ]; then 
dirname=$PWD/$dirname 
fi 
LD_LIBRARY_PATH=$dirname 
export LD_LIBRARY_PATH 
$dirname/myapp "[email protected]" 

這是我的Qt應用程序之一的目錄佈局的一個例子,我目前代理:

./myapp 
./myapp.png 
./myapp.sh 
./libQt5X11Extras.so.5 
./libQt5Core.so.5 
./libQt5Network.so.5 
./libQt5XcbQpa.so.5 
./libicui18n.so.56 
./libQt5Gui.so.5 
./libicuuc.so.56 
./libicudata.so.56 
./sqldrivers 
./sqldrivers/libqsqlite.so 
./libQt5Widgets.so.5 
./translations 
./translations/qt_es.qm 
./translations/qt_en.qm 
./platforms 
./platforms/libqxcb.so 
./libQt5Sql.so.5 
./libQt5DBus.so.5 
./bearer 
./bearer/libqnmbearer.so 
./bearer/libqgenericbearer.so 
./bearer/libqconnmanbearer.so 
./imageformats 
./imageformats/libqjpeg.so 

當然,你會需要更多或更少的庫,具體取決於應用程序的依賴關係。我目前使用的是官方的Qt 5.8安裝程序,所以共享庫來自那裏,而不是由發行版提供的。