Комментарии 34
Предварительное замечание об 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. Под арчем процесс кросс-компиляции под винду упрощается донемогу.
Установка тулкита:
Дальше можно собирать нужные проекты так:
И всё, остаётся только задеплоить нужные dll-ки из /usr/x86_64-w64-mingw32/bin/
Установка тулкита:
- Установить 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 нашёл только launchpad.net/~tobydox/+archive/ubuntu/mingw-x-trusty для ванильного Debian вообще как-то пусто.
К большому моему сожалению, для deb подобных репозиториев отыскать не удалось.
Кстати, а в mxe был скрипт для автодеплоя либ, но он почему-то работал лишь для i686, но не очень сложно его можно навелосипедить поверх objdump, который умеет pe заголовки.
Но оно же отлично собирается без ICU! Там и ключик в configure указан. Всё будет работать, но WebKit, да, не удастся собрать без ICU. Собрал, вот себе под Linux без всяких ICU — всё работает. Или это только для сборки под Win?
Спасибо за информацию. Я статический Qt 5 (мне нужны были только QtWidgets) собирал для Windows прямо в Windows, не было под рукой машинки с дистрибутивом GNU/Linux (даже виртуальной).
В принципе, ничего сложного там тоже нет. Напишу кратенькую инструкцию в комментариях, вдруг кому-нибудь она полезной тоже окажется. Тем более, на мой взгляд, эта инструкция будет хорошим дополнением к вашей статье.
Необходимо следующее:
И в принципе, для Qt Widgets и QtQuick этого более чем достаточно. Далее устанавливаем Python и распаковываем архив с исходниками в удобное для сборки место. Выше по уровню создаём директорию build-Qt5-static, картина должна быть такая:
Для того, чтобы каталог с исходниками остался чистым и можно было легко переконфигурировать Qt5 при какой-либо ошибке, лучше всего использовать теневую сборку (это когда сборка осуществляется за пределами каталога с исходным кодом), благо система сборки Qt её поддерживает.
Здесь есть важный момент. Если вы хотите, чтобы исполнительны файлы ваших приложений были полностью статические и автономные, то вам необходимо отредактировать файл qt-everywhere-opensource-src-5.4.1/qtbase/mkspecs/win32-g++/qmake.conf следующим образом:
Это «отвяжет» ваши исполнительные файлы от таких библиотек, как:
Так как они будут влинкованы статически. На выходе получится автономный исполнительный файл, который должен запускаться и работать в любой операционной системе Windows, начиная с Windows 2000 (или XP).
Теперь, когда всё готово к конфигурированию и компиляции, можно запускать процесс. Лично я для этого воспользовался таким вот простеньким bat-сценарием, назовём его Qt5.4.1-build-static.bat:
Объясню некоторые очевидные вещи. Переменная окружения 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.
В принципе, ничего сложного там тоже нет. Напишу кратенькую инструкцию в комментариях, вдруг кому-нибудь она полезной тоже окажется. Тем более, на мой взгляд, эта инструкция будет хорошим дополнением к вашей статье.
Необходимо следующее:
- MinGW-w64 32-bit.
Идеальный вариант — использовать тот, что идёт в бандле Qt 5 с MinGW под Windows, наверняка этот бандл у вас уже установлен. Если нет — не забудьте отметить инструментарий MinGW при установке. - Python 2.x.x.
Он потребуется системе сборки Qt для генерации некоторых заголовочных файлов. Я использовал Python версии 2.7.9. - Исходники 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 либо публиковать свои исходники.
Если не секрет, что у Вас за юзкейс, что необходима статическая линковка?
Статические версии сделаны «на всякий пожарный» ) Я пользуюсь 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, как и предполагалось изначально.
Вернёмся к ICU-библиотекам. Как оказалось, принудительная зависимость QtCore от них — это косяк билд-фермы Qt, тянущийся ещё с самого выхода Qt 5. Подробнее об этом можно почитать информацию в тикете багртрекера. В котором и пообещали исправить положение дел в будущем минорном релизе.
Мне даже не верится, что спустя столько времени, в Qt 5.5.0 библиотека QtCore по-умолчанию наконец-то освободится от зависимости далеко не аскетичных ICU-библиотек; и они будут необходимы лишь для работы QtWebkit/QtWebEngine, как и предполагалось изначально.
И ещё спрошу следующий интересующий меня момент.
У кого имеется статическая сборка Qt 5 под Windows, ответьте пожалуйста на следующие вопросы:
1. Зависит ли ваш исполнительный файл от таких библиотек, как:
?
2. Сколько МБ занимает у вас исполнительный файл с простой пустой формой QMainWindow и библиотеками указанными выше? Влинковать статически оные библиотеки можно добавив в ваш проектный файл строку:
Спасибо.
У кого имеется статическая сборка Qt 5 под Windows, ответьте пожалуйста на следующие вопросы:
1. Зависит ли ваш исполнительный файл от таких библиотек, как:
- libgcc_s_dw2-1.dll
- libstdc++-6.dll
- libwinpthread-1.dll
?
2. Сколько МБ занимает у вас исполнительный файл с простой пустой формой QMainWindow и библиотеками указанными выше? Влинковать статически оные библиотеки можно добавив в ваш проектный файл строку:
QMAKE_LFLAGS += -static -static-libgcc -static-libstdc++
Спасибо.
Ничего не понял :)
Qt отлично компилируется под Win x32/x64/static/shared безо всяких линуксов.
valgring на фоне возможностей MS Studio уныл до безобразия.
QtCreator тоже не фонтан
Qt отлично компилируется под Win x32/x64/static/shared безо всяких линуксов.
valgring на фоне возможностей MS Studio уныл до безобразия.
QtCreator тоже не фонтан
Значит для вас эта статья бесполезна — постарайтесь развидеть ее :))))
Попробуйте QBS.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Кросс-компиляция Qt5 под Linux для Win x32/x64/static/shared