MyTetra Share
Делитесь знаниями!
Статическая сборка Qt-проектов в 2022 году
Время создания: 07.02.2022 16:48
Текстовые метки: qt, сборка, линковка, статическая, динамические библиотеки
Раздел: Компьютер - Программирование - Язык C++ (Си++) - Библиотека Qt - Инсталляция Qt и сборка проектов
Запись: xintrea/mytetra_syncro/master/base/1644241691tyzqwc6w1e/text.html на raw.github.com

Самое главное


Чтобы слелать статическую сборку проекта на Qt нужно сначала статически собрать саму Qt. Или установить пакетным менеджером уже собранную статически кем-то добрым Qt. И смотря под какую ОС.

Если для Linux - FreeBSD, то берёшь инструкцию по сборке статического варианта, пакетным менеджером ставишь все нужные dev-пакеты и собираешь. Положить лучше в opt.

Если под винду и MSVS то тут надо самому собирать по миру требуемые для сборки 3rd библиотеки, компилять их и собирать статический Qt. В общем запаришься. Либо поставить MSYS2 и там уже есть готовый откомпилированный пакет qt5_static и qt6_static. Нужно только установить и скормить путь до пакета QtCreator. В принципе, под MSYS2 можно, как и под Linux скомпилировать Qt статически самостоятельно. Все пакеты поставить менеджером.

Также можно использовать Gygwin, и самому, опять же, собрать статический вариант Qt.


Подробности

1. При сборке самой Qt (а это, как тебе уже написали, первый необходимый шаг) особенности платформ учесть всё же придётся. Но это при благоприятном стечении обстоятельств достаточно сделать единожды.

А сборка твоего проекта — да, ничем не будет отличаться от обычной, просто укажешь путь к нужной qmake.

2. Чтобы сделать проект без внешних зависимостей во время запуска (т.е. сделать а ля портабельную версию приложения), можно скопировать все динамические библиотеки-зависимости в каталог с исполняемым файлом и настроить такую вещь как RPATH на этапе сборки. Если захочешь идти по пути - то могу подсказать подробности.

А вот собирать библиотеку Qt в статическом виде, особенно в винде - это очень нетривиальная задача.

3. Если и статический Qt собрать с опцией -flto, и прилагу на нём – всё должно быть пучком.

(возможно, нужна булет опция -flto=`nproc`)

UPD. Ну, разве что сам Qt внутри себя высокосвязанный и протащит дохренища своего барахлишка даже при минимальном использовании.

4. Есть готовые статические сборки под Windows. Например, вот: https://packages.msys2.org/search?q=qt+static. Под Linux такое наверное не завезли и придётся страдать целый день с многочасовым конфигурированием и компиляцией Qt.

5. К большому сожалению большинство инструкций давным давно устарело и они имеют разные недостатки, вроде:

Для работы наших программ по-прежнему нужны библиотеки mingwm10.dll и libgcc_s_dw2-1.dll. Возможно, их тоже можно как-то слинковать статически, но как - я ещё не разобрался. Впрочем, они небольшие и погоды не делают.

К слову это лечится либо флагом -static-libgcc, либо конструкцией вида:


QMAKE_LFLAGS = -static -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc


В 2022 году наиболее беспроблемный способ заиметь статическую сборку Qt на Windows за 10 минут, а не за два дня, это использовать MSYS2 в котором добрые и заботливые люди уже давно приготовили пакеты qt5-static и qt6-static и даже обновляют их постоянно.

Ну а в Linux-дистрибутивах лучший вариант это использование FlatPak или Snap, либо нативного пакета под свой дистр без какой-либо статики. AppImage слабо подходит, потому что наплевательски относится к тем же темам Qt в дистрибутиве.

Примечание: флаг -static-libgcc желательно применять не только к сборке проекта, но и ко сборке всего Qt.

6. Говорят, что для Qt под Linux статическая сборка нереальна. QPA – всё равно .soшки, даже если эти либы сами не имеют зависимостей. Но решение есть: для статической сборки нужно ещё было править сами исходные файлы своей программы, добавляя в них конструкции вида:


Q_IMPORT_PLUGIN(QXcbIntegrationPlugin)


Как раз связанные с QPA. В общем, статическая сборка это всего боль и компромиссы.


Выходит, что проще всего делать обычный бинарник, и рядом класть so/dll файлы, для обеспечения работы на системах где Qt не установлен.


Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования