Linux 上的 Qt 5.8 (ubuntu 16.04) 应用程序部署
Posted
技术标签:
【中文标题】Linux 上的 Qt 5.8 (ubuntu 16.04) 应用程序部署【英文标题】:Qt 5.8 (ubuntu 16.04) application deployment on Linux 【发布时间】:2017-05-28 23:59:41 【问题描述】:我有一个使用 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。在这种情况下 -Wl -rpath 会做什么?
有人知道如何让Qt从当前工作目录加载*.so文件吗?
谢谢
【问题讨论】:
"是否需要以特定方式安装 Qt 才能获取配置脚本?"我假设您需要从源代码构建和安装 Qt——而不是安装预构建的二进制包——才能拥有configure
脚本。这是 *nix 软件的惯例。
你可以去Deployment with package看看
【参考方案1】:
configure
脚本在您从源代码构建 Qt 时出现,您可能不需要它。要从当前工作目录加载共享库,您需要将 LD_LIBRARY_PATH
环境变量指向共享库所在的目录。您可以在Linux Deployment 的官方 Qt 文档中找到执行此操作的脚本示例。例如,我在我的部署中使用这个修改后的脚本:
#!/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 "$@"
这是我当前分发的一个 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 安装程序,因此共享库来自那里,而不是发行版提供的那些。
【讨论】:
以上是关于Linux 上的 Qt 5.8 (ubuntu 16.04) 应用程序部署的主要内容,如果未能解决你的问题,请参考以下文章
在 linux ubuntu 上的 Qt 5 中运行 qwt 示例
由 arm-none-linux-gnueabi 进行的 Qt 5.8 交叉编译失败?