Правильное развертывание приложений Qt в Linux - PullRequest
0 голосов
/ 03 сентября 2018

Я написал приложение, используя 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 в моей системе в папку с именем «шрифты» в каталоге моей программы и создал сценарий 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. Я пробовал и полный путь, и использовал ./ для ссылки на текущий каталог, но ни один из них не приводит к появлению изображения.

1 Ответ

0 голосов
/ 03 сентября 2018

FWIW, способ, которым моя компания упаковывает сборку Linux своего приложения Qt, с динамическими библиотеками, как показано на прикрепленном скриншоте. Обратите внимание, что фактический исполняемый файл (показанный как «MyApp» на скриншоте, который я немного подправил для защиты невинных) находится внутри подкаталога «bin» вместе со всеми необходимыми файлами разделяемой библиотеки. В главном каталоге находится короткий скрипт оболочки («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, хе).

Screenshot of Linux distribution file tree

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...