2017-05-28 96 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安装程序,所以共享库来自那里,而不是由发行版提供的。