首页 > 解决方案 > 在 Linux 中正确部署 Qt 应用程序

问题描述

我已经使用 Qt 编写了一个应用程序,我正在尝试部署它。我构建了我的应用程序并尝试分发它,但我最终不得不静态构建 Qt,这样用户就不需要安装 Qt 的库来运行我的应用程序。唯一的问题是字体损坏,图像无法加载。

为了静态构建 Qt,我这样做了:

./configure -static -release -ltcg -optimize-size -no-pch -prefix "/home/myuser/Qt/5.11.1-static" -skip webengine -nomake tools -nomake tests -nomake examples -fontconfig
make -j4
make -j4 install

然后是字体不起作用的问题。我不断收到错误“QFontDatabase:找不到字体目录(Qt 安装目录)/libs/fonts”,因此我将系统上的 dejavu 字体文件夹复制到程序目录中名为“fonts”的文件夹中,并创建了一个 Bash 脚本将 QT_QPA_FONTDIR 设置为新的字体目录。这使错误消失并使我的应用程序上的文本可见,但是当输入密码时,会显示空白字符而不是星号或任何其他字符。此外,图像不显示。我在与应用程序相同的目录中有一个文件夹,名为“images”,里面有我的图像,所以我这样做了:

QIcon home("(program directory)/images/home.svg");
QIcon vpn("./images/vpn.svg");
ui->tabWidget->setTabIcon(0, home);
ui->tabWidget->setTabIcon(1, vpn);

图像不显示,但如果程序是使用动态 Qt 构建的,它们会显示。我尝试了完整路径和使用 ./ 来引用当前目录,但都没有导致图像出现。

标签: c++linuxqt

解决方案


FWIW,我的公司打包其 Qt 应用程序的 Linux 版本的方式是使用动态库,如随附的屏幕截图所示。请注意,实际的可执行文件(在屏幕截图中显示为“MyApp”,我对其进行了一些修改以保护无辜者)与所有必要的共享库文件一起位于“bin”子目录中。在主目录中有一个简短的 shell 脚本(“MyApp.sh”),如下所示:

#!/bin/bash
unset QT_PLUGIN_PATH   
appname=$(basename "$0" .sh)
dirname=$(dirname "$0")
cd "$dirname/bin"
export LD_LIBRARY_PATH=`pwd`
./$appname "$@"

...用户应运行 MyApp.sh 脚本,该脚本将适当地设置 LD_LIBRARY_PATH 变量,然后运行可执行文件。

它不是世界上最优雅的东西,但它可以完成工作(很像 Linux 本身,呵呵)。

Linux 分发文件树的屏幕截图


推荐阅读