Pull to refresh

Comments 34

По вашей ссылке:
The decision to no longer use ICU was made as a result of discussions at QtCS and on the development list.
Возможно. До некоторого времени было именно так, как я написал в статье. Возможно я не ознакомился с «новостями»
Предварительное замечание об MXE. Это отличнейшая система сборки тулчейнов для кросс-компиляции.


Чем она лучше по сравнению с crossdev, раз уж вы говорите про Gentoo? crossdev позволяет сказать «crossdev x86_64-pc-mingw32» и получить на выходе готовый тулчейн. Причем без скачивания подозрительный shell-скриптов и с регистрацией в системном менеджере пакетов (что позволяет безнапряжно обновлять/удалять тулчейны). Куда отличнее-то?
Ещё напомню про такую вещь, как crosstool-ng, хорошая альтернатива MXE, если вы используете дистрибутив отличный от Gentoo.
Она лучше crossdev тем, что уже имеет набор пропатченных и проверенных конфигураций сборки различных сторонних библиотек. Ели я не ошибаюсь, пользуя crossdev, вы сами должны заниматься конфигурацией и поиском нужных патчей. А тут все «из коробки». Это, имхо, удобнее.
С помощью crossdev можно собирать штуки уровня zlib, он вообще не пригоден для сборки mingw окружения.
Какое-то время мучился с крос-компиляцией, пробуя и ручную сборку всего и вся, MXE, сборку всего под виндой отдельно. Остановился на очень простом, легко настраиваемом (10 минут) и хорошо расширяемом (а если нужны другие библиотеки...) варианте: Arch Linux MinGW-w64 repository. Под арчем процесс кросс-компиляции под винду упрощается донемогу.
Установка тулкита:
  • Установить Arch Linux на ВМ (например). Если вручную лень, есть Evo/Lution.
  • Добавить MinGW-w64 repository.
  • Установить нужные библиотеки (доступно 419 готовых пакетов) с суффиксом -mingw-w64. Например так:
    pacman -S mingw-w64-qt5-base mingw-w64-cmake mingw-w64-zlib mingw-w64-openssl mingw-w64-boost
  • Профит!

Дальше можно собирать нужные проекты так:
x86_64-w64-mingw32-cmake ..
make
или так:
x86_64-w64-mingw32-qmake-qt5
make

И всё, остаётся только задеплоить нужные dll-ки из /usr/x86_64-w64-mingw32/bin/
Спасибо огромное за информацию! Так гораздо удобнее.
а подобное под apt-get не встречали?
это уже что-то. Шаг в нужном направлении, но готовых пакетов слишком мало, даже буста нет :(.
К большому моему сожалению, для deb подобных репозиториев отыскать не удалось.
Кстати, а в mxe был скрипт для автодеплоя либ, но он почему-то работал лишь для i686, но не очень сложно его можно навелосипедить поверх objdump, который умеет pe заголовки.
Но оно же отлично собирается без ICU! Там и ключик в configure указан. Всё будет работать, но WebKit, да, не удастся собрать без ICU. Собрал, вот себе под Linux без всяких ICU — всё работает. Или это только для сборки под Win?
В статье я указал именно сборку Qt5 используя MXE. А там, если просто указать цель qt5 — соберется абсолютно все. Внизу статьи есть пример этому. Поэтому Qt5 я собирал вручную, и только то, что мне было нужно.
Спасибо за информацию. Я статический Qt 5 (мне нужны были только QtWidgets) собирал для Windows прямо в Windows, не было под рукой машинки с дистрибутивом GNU/Linux (даже виртуальной).

В принципе, ничего сложного там тоже нет. Напишу кратенькую инструкцию в комментариях, вдруг кому-нибудь она полезной тоже окажется. Тем более, на мой взгляд, эта инструкция будет хорошим дополнением к вашей статье.

Необходимо следующее:

  1. MinGW-w64 32-bit.
    Идеальный вариант — использовать тот, что идёт в бандле Qt 5 с MinGW под Windows, наверняка этот бандл у вас уже установлен. Если нет — не забудьте отметить инструментарий MinGW при установке.
  2. Python 2.x.x.
    Он потребуется системе сборки Qt для генерации некоторых заголовочных файлов. Я использовал Python версии 2.7.9.
  3. Исходники Qt 5.


И в принципе, для Qt Widgets и QtQuick этого более чем достаточно. Далее устанавливаем Python и распаковываем архив с исходниками в удобное для сборки место. Выше по уровню создаём директорию build-Qt5-static, картина должна быть такая:

build_place/                                # Удобное для сборки место
   |
   +---build-Qt5-static                     # Тут каталог для сборки
   |
   +---qt-everywhere-opensource-src-5.4.1   # Тут исходники Qt


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

Здесь есть важный момент. Если вы хотите, чтобы исполнительны файлы ваших приложений были полностью статические и автономные, то вам необходимо отредактировать файл qt-everywhere-opensource-src-5.4.1/qtbase/mkspecs/win32-g++/qmake.conf следующим образом:

diff -Naur qt-everywhere-opensource-src-5.4.1.orig/qtbase/mkspecs/win32-g++/qmake.conf qt-everywhere-opensource-src-5.4.1/qtbase/mkspecs/win32-g++/qmake.conf
--- qt-everywhere-opensource-src-5.4.1.orig/qtbase/mkspecs/win32-g++/qmake.conf	2013-06-07 12:17:00 +0700
+++ qt-everywhere-opensource-src-5.4.1/qtbase/mkspecs/win32-g++/qmake.conf	2013-08-29 23:40:45 +0700
@@ -15,7 +15,7 @@
 TEMPLATE		= app
 CONFIG			+= qt warn_on release link_prl copy_dir_files debug_and_release debug_and_release_target precompile_header
 QT			+= core gui
-DEFINES		+= UNICODE
+DEFINES		+= UNICODE QT_STATIC_BUILD
 QMAKE_COMPILER_DEFINES  += __GNUC__ WIN32
 
 QMAKE_EXT_OBJ           = .o
@@ -32,7 +32,7 @@
 QMAKE_CFLAGS_DEPS	= -M
 QMAKE_CFLAGS_WARN_ON	= -Wall -Wextra
 QMAKE_CFLAGS_WARN_OFF	= -w
-QMAKE_CFLAGS_RELEASE	= -O2
+QMAKE_CFLAGS_RELEASE	= -O2 -Os
 QMAKE_CFLAGS_DEBUG	= -g
 QMAKE_CFLAGS_YACC	= -Wno-unused -Wno-parentheses
 
@@ -70,7 +70,7 @@
 
 QMAKE_LINK		= $${CROSS_COMPILE}g++
 QMAKE_LINK_C		= $${CROSS_COMPILE}gcc
-QMAKE_LFLAGS		=
+QMAKE_LFLAGS		= -static -static-libgcc -static-libstdc++
 QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads
 QMAKE_LFLAGS_EXCEPTIONS_OFF =
 QMAKE_LFLAGS_RELEASE	= -Wl,-s

Это «отвяжет» ваши исполнительные файлы от таких библиотек, как:

  • libgcc_s_dw2-1.dll
  • libstdc++-6.dll
  • libwinpthread-1.dll

Так как они будут влинкованы статически. На выходе получится автономный исполнительный файл, который должен запускаться и работать в любой операционной системе Windows, начиная с Windows 2000 (или XP).

Теперь, когда всё готово к конфигурированию и компиляции, можно запускать процесс. Лично я для этого воспользовался таким вот простеньким bat-сценарием, назовём его Qt5.4.1-build-static.bat:

SET QTDIR=D:\Dev\Toolkits\Qt\Qt5.4.1-static
SET PATH=D:\Dev\Toolkits\Qt\Qt5.4.1\Tools\mingw491_32\bin;D:\Dev\Toolkits\Python;D:\Dev\Toolkits\Python\Scripts;%PATH%

..\qt-everywhere-opensource-src-5.4.1\configure -opensource -release -static -confirm-license -c++11 -ltcg -no-compile-examples -no-nis -no-neon -no-iconv -no-evdev -no-mtdev -no-inotify -no-eventfd -largefile -no-fontconfig -no-system-proxies -no-icu -no-freetype -no-harfbuzz -no-angle -no-incredibuild-xge -no-plugin-manifests -rtti -strip -no-ssl -no-openssl -no-dbus -no-qml-debug -audio-backend -no-directwrite -no-direct2d -no-style-fusion -no-mp -nomake examples -nomake tools -platform win32-g++ -opengl desktop -prefix %QTDIR%

mingw32-make -j19

mingw32-make install

Объясню некоторые очевидные вещи. Переменная окружения QTDIR определяет то, куда будет установлен наш статически собранный Qt 5; исправьте эту переменную в соответствии со своими предпочтениями. Переменная окружения PATH задаёт путь до исполнительных файлов инструментария MinGW-w64 (компиляторы, линковщики, архиваторы и прочие утилиты), кроме того, в PATH определён путь до установленного Python и его скриптов. Задайте значение этой переменной в соответствии с установленным в вашу систему окружением для сборки. Далее идёт длинная команда конфигурирования (список всех параметров можно посмотреть в документации или выполнив configure.bat -help), команда сборки (опция -jX используется для распараллеливания, рекомендуемое значение зависит от характеристик вашего компьютера и рассчитывается по формуле X = N + 1, где N — число ядер вашего процессора); и завершается сценарий командой установки, которая скопирует скомпилированные библиотеки и инструменты в директорию, определённую в QTDIR.

Файл Qt5.4.1-build-static.bat, с вашими установками, кидаем в директорию build-Qt5-static и запускаем. Запускать bat-сценарий лучше всего не двойным кликом по нему, а из командной строки, чтобы иметь возможность среагировать на ошибку. Для этого: заходим с помощью проводника в директорию build-Qt5-static, и держа зажатой клавишу Shift, кликаем на пустое место в директории правой кнопкой мышки. В появившемся контекстном меню выбираем пункт «Открыть окно команд». В командной строке вводим имя bat-сценария: Qt5.4.1-build-static.bat и нажимаем клавишу Enter для запуска продолжительной процедуры сборки. Пока Qt 5 собирается можно выпить чашку кофе. Я бы даже сказал, много чашек кофе.

Небольшой совет. Если сборка завершилась с ошибкой, а вы использовали параллельную компиляцию (mingw32-make c опцией -jX), то часто возникает ситуация, что ошибка компиляции «улетела далеко наверх» и её не видно в окне и буфере командной строки. Для того, чтобы посмотреть на чём же всё-таки прервалась компиляция, достаточно повторно запустить mingw32-make без опции -jX. Через некоторое время (когда цели mingw32-make соберутся и он перейдёт на ту, что приводит к ошибке компиляции), в выхлопе появится и досадная ошибка.

Подробнее про сборку Qt 5 для Windows можно почитать официальную документацию и страничку в официальной Wiki.
… и естественно, для всего вышеперечисленного, нужно обладать коммерческой лицензией на Qt либо публиковать свои исходники.
Если политика лицензирования в последнее время не менялась, то коммерческая лицензия нужна только в случае статической линковки Qt
Человек, которому я отвечал, про нее и рассказывал.
Ясно, значит я перепутал, к кому было обращение
Можно обойтись объектниками, чтобы была возможность перелинковать приложение с другой версией Qt.
Если не секрет, что у Вас за юзкейс, что необходима статическая линковка?
Статические версии сделаны «на всякий пожарный» ) Я пользуюсь shared-сборками.
Вообще мне, как и наверняка большинству, потребовалась пересборка Qt 5 не ради статической линковки, а ради освобождения QtCore от зависимости в виде тяжёлых ICU-библиотек. Я посчитал неприемлемым то, что вместе с программой тянутся целых ~30MB библиотек, функции которых программка по сути дела вообще не использует. Ну и раз не обойтись без пересборки фреймворка, было решено попробовать ещё и статическую линковку. Утилитка (кстати OpenSource) маленькая, поэтому собирать для неё что-то вроде установщика, было бы дико. Распространение с помощью единого исполнительного файла на мой взгляд очень удобно для простенькой программы. Кстати, я заметил что статическая линковка сейчас «в моде»: некоторые популярные Qt-приложения используют именно её, например, так делают IM-мессенджер Telegram и качалка torrent'ов — qBittorrent (кстати советую, отличная штука).

Вернёмся к ICU-библиотекам. Как оказалось, принудительная зависимость QtCore от них — это косяк билд-фермы Qt, тянущийся ещё с самого выхода Qt 5. Подробнее об этом можно почитать информацию в тикете багртрекера. В котором и пообещали исправить положение дел в будущем минорном релизе.

Мне даже не верится, что спустя столько времени, в Qt 5.5.0 библиотека QtCore по-умолчанию наконец-то освободится от зависимости далеко не аскетичных ICU-библиотек; и они будут необходимы лишь для работы QtWebkit/QtWebEngine, как и предполагалось изначально.
Я думаю — все ж дело времени.Рано или позно, многое меняется. К примеру тренд замены OpenSSL на LibreSSL. *BSD системы осознали и начали процесс «модернизации». Надо уметь ждать :)
И ещё спрошу следующий интересующий меня момент.
У кого имеется статическая сборка Qt 5 под Windows, ответьте пожалуйста на следующие вопросы:
1. Зависит ли ваш исполнительный файл от таких библиотек, как:

  • libgcc_s_dw2-1.dll
  • libstdc++-6.dll
  • libwinpthread-1.dll

?
2. Сколько МБ занимает у вас исполнительный файл с простой пустой формой QMainWindow и библиотеками указанными выше? Влинковать статически оные библиотеки можно добавив в ваш проектный файл строку:

QMAKE_LFLAGS += -static -static-libgcc -static-libstdc++

Спасибо.
Статические сборки x32/x64, сделанные по моей статье — полностью статические :) т.е.отвязаны от всех внешних библиотек, в том числе и идущих с GCC
Пустую форму не делал. Но, к примеру, калькулятор из примеров (x64,static) — весит 17 метров
Да, у меня тоже 17MB получилось. Странно то, что получилось так много. Если этот калькулятор собирать с использованием статической Qt 4, то получается всего 9МБ.
Без понятия. Все либы вроде «пострипаны», хотя нужно проверить.
Ничего не понял :)
Qt отлично компилируется под Win x32/x64/static/shared безо всяких линуксов.
valgring на фоне возможностей MS Studio уныл до безобразия.
QtCreator тоже не фонтан
Значит для вас эта статья бесполезна — постарайтесь развидеть ее :))))
Sign up to leave a comment.

Articles