LINUX.ORG.RU

Статическая сборка Qt5 и шрифты

 ,


1

1

Привет, ЛОР.

Я сейчас осваиваю статическую сборку Qt5 для линукса. (Для Windows я эту задачу решил давно, в линуксе лично меня устраивает Qt из репозиториев, но понятно, что для пользователей произвольного дистрибутива, хотя бы в рамках x86_64, нужна универсальная сборка.)

Сборку веду из тарболла qt-everywhere-src-5.12.12.tar.xz под старенькой Ubuntu 18.04. Почему именно 5.12, а не 5.15 – в 5.15 поменялись ключи для включения libxcb в сборку (если её не включать, Qt при запуске прикладной программы будет искать xcb-плагин и разумеется, обломается), и новые ключи у меня пока не заработали.

Кроме очевидного build-essential, я доустановил (как раз для xcb) пакеты libx11-*, libxcb-*, libxkbcommon-dev и libxkbcommon-x11-dev, а также (на будущее, для OpenSSL) libssl-dev. Из конфига исключены QtWebEngine, QML и openGL (но QML и openGL я планирую вернуть потом).

Мой текущий configure для Qt:

QTDIR=/opt/Qt/5.12.12.st

sudo mkdir -p ${QTDIR}

./configure -opensource -confirm-license -platform linux-g++ -static -release \
 -skip qtwebengine -no-opengl \
 -qt-xcb -I /usr/include/xcb/ -L /usr/lib/x86_64-linux/gnu/ \
 -qt-zlib -qt-libpng -qt-libjpeg -openssl-linked -nomake examples -prefix ${QTDIR}

Далее понятно, make и sudo make install. Сборка прошла успешно. Далее собираю с этим Qt DoubleContact (пришлось немного пропатчить исходники, чтобы алгоритм прицепливания встроенного в Qt zlib-а работал). Полученный бинарник я вытаскиваю из виртуалки на хост (Manjaro KDE), запускаю. Открывается окно с табличками без единого символа. При этом видно, что логика программы работает, окна вызываются (если помнишь, куда тыкать).

В konsole ругань следующая:

QFontDatabase: Cannot find font directory /opt/Qt/5.12.12.st/lib/fonts.
Note that Qt no longer ships fonts. Deploy some (from https://dejavu-fonts.github.io/ for example) or switch to fontconfig.

Вопрос 1. Я правильно понимаю, что Qt именно в этом каталоге и собирается шрифты искать во время выполнения (судя по тому, что путь оказывается захардкожен в бинарник уже моей программы)? Если так, то это не то, что мне надо.

Исходя из этого предположения, я поискал другие пути. В принципе, через QFontDatabase::addApplicationFont() и QApplication::setFont() можно добавить любой нужный шрифт и даже добавить его в ресурсы программы. Программа при этом начинает показывать строки нормально… если ограничиваться одним шрифтом. Но у меня, например, в программе есть ещё и кутешный диалог выбора шрифтов для таблиц, и он при таком решении показывает только один шрифт – именно тот, который я добавил.

Вопрос 2. Можно ли как-то заставить программу искать шрифты уже в той системе, на которой он запускается? В том же QFontDatabase я вижу только методы добавления шрифтов по одному, я так понимаю, работе QFontDialog это не сильно поможет.

Вопрос 3. Формулировку «switch to fontconfig» я не очень понял, fontconfig – это ведь библиотека? И что мне с ней делать?

Интересно, что со статической сборкой под винду этой проблемы нет. Правда, виндовые сборки, которые я раньше распространял, основаны на более ранних версиях Qt (4.8 и 5.10).

Обновление. Проблема решилась по наводке анонимуса. Я поставил пакеты libfreetype6-dev и libfontconfig1-dev и в ./configure дополнительно к указанному выше написал:

-fontconfig -feature-freetype -system-freetype FREETYPE_INCDIR=/usr/include/freetype2

После этого при переносе бинарника со сборочной виртуалки на хостовую систему программа запускается с отображением текста без плясок с QFontDatabase. Диалог шрифтов для таблицы в настройках также отображает все доступные шрифты.

Отмечаю тему решённой. Но если у кого есть рабочий комплект ключей к Qt 5.15 (особенно в части libxcb) – будет интересно почитать и скорее всего, не только мне.

★★★★★

Последнее исправление: hobbit (всего исправлений: 9)
Ответ на: комментарий от rumgot

Кстати, @roxton таки сумел в три мажорные версии Qt без потери совместимости:

TEA is a C++, Qt(4,5,6) text editor with the hundreds of features for Linux, *BSD, Mac, Windows, OS/2 and Haiku.

Пруф для неЪ

Мой ему респект, проторил дорожку. Я тоже попробую.

hobbit ★★★★★
() автор топика
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от rumgot

Ну-съ.. статичная сборка есть один изъ графовъ безопасности ПО. Но, мы пожалуй не будемъ требовать отъ автора полного раскрытия этой занимательной темы. Понятно.

anonymous
()
Ответ на: комментарий от rumgot

Сторонние подмененные библиотеки вроде не подгружатся. Подробнее это описано в блфс. Далее развивать не буду т.к. упремся в холивар, а у меня Интернет трафик урезан(

anonymous
()
Ответ на: комментарий от rumgot

Ну.. «сферический пример», оторванный от реальности:

Злодеи-мантейнеры арча некорректно обновили пустяшную библиотечку ICU, а тебе нужно вносить данные в app - блокнот/бд. )

anonymous
()
Ответ на: комментарий от IIIypuk

Я в курсе, 4 и 5 у меня поддерживаются сейчас, и в общем, условных компиляций очень мало. Но 3 ветки это другой уровень (нередко какую-то фичу в N+1 объявляют deprecated, а в N+2 удаляют, вот тут и повеселимся…).

hobbit ★★★★★
() автор топика