Кросскомпиляция qt linux под windows

QtCreator: Qt кросс-компиляция из linux 64 в linux 32, win32, win64 и Mac OS X; upx, usb, dmg, etc

Библиотека Qt позволяет делать действительно кроссплатформенные приложения. Единожды написанный код можно откомпилировать под многие операционные системы. Но проблема именно в слове «компилировать», т.к. подразумевается, что необходимо перезагрузиться под целевую систему, иметь в ней настроенную среду разработки, установленный и настроенный зоопарк библиотек. Спасает кросс-компиляция — компиляция, производящая исполняемый код для платформы, отличной от той, на которой исполняется.

Кросс-компиляция для Windows 64

Обычно одной из наиболее востребованных проблем является сборка Windows-версии своего приложения, изначально разрабатывающегося под Linux. Пример решения этой проблемы можно увидеть тут или на русском. Необходимо создать mkspecs-конфигурацию, положить файлы Qt в соответствующие директории и всё. Компилировать Qt в таком случае не обязательно, можно скачать бинарники с официального сайта.
У такого подхода есть несколько минусов: 1) QtCreator об установленной таким образом библиотеке ничего не знает; 2) Официальной сборки Qt для Windows x64 не существует. И если с первой проблемой ещё как-то можно бороться, то против второй поможет только компиляция…

Перед кросс-компиляцией не забудьте поставить непосредственно сам кросс-компилятор (ищется в пакетом менеджере по названию «mingw»). И скачать исходники qt-everywhere с официального сайта. В директории mkspecs распакованного архива копируем папку win32-g++ в win64-x-g++ и корректируем содержимое файла qmake.conf. У меня получилось следующее:

По сути в файле спецификации были заменены только пути.

Я выполнял configure со следующими параметрами:
./configure -xplatform win64-x-g++ CROSS_COMPILE=x86_64-w64-mingw32- -prefix /usr/local/qt4win64 -no-webkit -no-phonon -no-phonon-backend -no-script -no-scripttools -no-multimedia -no-qt3support -fast -nomake demos -nomake examples -nomake tools -device-option -little-endian -qt-zlib -qt-libpng -qt-libjpeg -openssl-linked -no-fontconfig -no-3dnow -no-ssse3 -continue
Здесь собираю минимальную версию Qt без webkit, phonon, multimedia и т.п. Полный список опций можно посмотреть по команде ./configure —help

Соответственно, для такой сборки должен быть установлен пакет g++-mingw-w64-x86-64, содержащий в себе x86_64-w64-mingw32-g++ (в убунту пакет надо ставить отдельно).

Далее make && sudo make install. На первом этапе компиляции используется родной системный компилятор, он собирает необходимые утилиты для linux, которые будут использоваться для сборки уже windows-бинарников.
После установки у меня в /usr/local/qt4win64/bin лежат PE32+ DLL и несколько ELF 64-bit LSB executable, в том числе: qmake, uic, moc, rcc. Вот они то и пригодятся для QtCreator!

После установки не удаляйте распакованную директорию — она используется.

Кросс-компиляция для Windows 32

Аналогична компиляции для Win64. За исключением того, что есть официальная сборка, и саму библиотеку компилировать не нужно! Достаточно собрать qmake, uic, moc, rcc.

Кросс-компиляция для Mac OS X

Кросс-компиляция для мака тоже очень похожа, за исключением того, что надо будет собрать и компилятор. Я собирал по этой инструкции. Это отняло полный день времени и кучу нервов. В процессе будет нужна рабочая Mac OS X (как минимум на виртуальной машине) с установленным XCode, чтобы взять оттуда необходимые файлы. При компилировании своих Qt-приложений запущенная Mac OS X не нужна.

Читайте также:  Linux как обновить драйвер сетевой карты

Помните, в Mac OS X для линковки с библиотекой .a-файлы не нужны.

Настройка QtCreator

Сначала нужно добавить в список все установленные компиляторы. Инструменты — Параметры — Сборка и запуск — Инструментарии:

QtCreator обычно нормально определяет ABI, но лучше перепроверить. Так же можно заметить, что системный x64 GCC в linux умеет генерировать и 32-битные приложения. Однако это не отменяет того, что также необходимы 32-битные версии библиотек.

После компиляторов можно добавить профили Qt:

Вот при добавлении профиля и пригодятся собранные ранее qmake, uic, moc, rcc, ведь нужно выбрать директорию с qmake. Жёлтый значок с восклицательным знаком слева от профиля означает warning, но QtCreator может использовать такой профиль Qt. А вот если значок красный, то профиль нерабочий. Такое может случиться при неправильной структуре каталогов. Или если удалить директорию, в которой компилировали Qt.

Следующие настройки нужно делать в каждом создаваемом проекте.
Для добавления конкретного профиля Qt надо при активном проекте зайти на вкладку «Проекты» (Ctrl+5):

По умолчанию в списке «Изменить конфигурацию сборки» есть только системный профиль Qt. Зато в списке кнопки «Добавить» есть все профили Qt, добавленные в параметры сборки.

В основных настройках сборки необходимо проверить пару библиотека-компилятор. Чтоб и то и другое было от одной и той же операционной системы.

Этапы сборки «qmake» и «Сборка» QtCreator ставит по умолчанию. А вот особые этапы «upx» и «dmgbuild» я добавил вручную для своего проекта. Этап «upx» выполняется каждый раз при нажатии на кнопку «Собрать проект». Однако если исполняемый файл не был изменён, то upx вернёт ошибку, что файл им уже обработан. В случае ошибки следующий этап не вызывается, т.е. dmg-файл обновится только если upx отработал успешно.

Для работы этапа upx он должен быть установлен в системе. Однако даже работая в linux-окружении и поставленный из пакетного менеджера upx умеет ужимать приложения: linux32/64, win32, macos32/64. Далеко не для всех проектов upx-сжатие реально нужно, этап показан скорее для примера.

Для этапа «dmgbuild» я воспользовался скриптом make_dmg. Ему нужны права root, поэтому добавил скрипт в файл /etc/sudoers

Изменения в проектном файле и использование сторонних библиотек

В моём проекте используется libusb, а это далеко не часть Qt. Также необходимо было включить платформенно-зависимую реализацию HID. В проектный файл были добавлены строки:

В Mac OS X и Linux линкуемся с системной libusb, в Windows в зависимости от разрядности линкуемся с libusb-1.0-32.dll.a или libusb-1.0-64.dll.a. Помним, что .a-файл может быть переименован, но зависеть приложение всё-равно будет от libusb-1.0.dll. В Linux параметры для libusb берём через системную утилиту pkgconfig. Кроме libusb подключаем для каждой операционной системы необходимые системные библиотеки и иконки.

Удобно разнести итоговые файлы для разных операционных систем по директориям. Сделать это можно так:

Цель win64-x-g++ относится к win32, однако в проектном файле идёт последней и переписывает настройки.

Читайте также:  Mp540 canon сканер драйвер для windows 10

Источник

Qt & Ubuntu. Настраиваем среду для компиляции win32-приложений


Эта мини-статья рассказывает об одном из способов осуществления кросс-компиляции приложений Qt для платформы win32.

Начнем с того, что скачаем и установим родной Qt SDK (для Linux).
Как вариант — выполним в консоли:

Я поставил Qt SDK Linux в папку «/home/caiiiycuk/qt-cross/qt-linux», так что будьте внимательны к путям.

Следующий этап, пожалуй, самый проблематичный — нам нужно раздобыть скомпилированные библиотеки Qt для целевой платформы (windows). Есть два варианта: либо скомпилировать их с помощью кросс-компиляции из исходников (что, как мне кажется, будет очень не просто); либо поставить Qt SDK на какую-нибудь win-машину, а затем заботливо перенести папочку с Qt в родную систему. Я пошел вторым путем и Qt SDK для Windows уютно обосновалося в папочке /home/caiiiycuk/qt-cross/qt-win.

Отлично, теперь настроим среду компиляции windows. Установим mingw-компилятор из репозитория Ubuntu:

По окончании установки станет доступен тулкит i586-mingw32msvc-*, которым мы и будем компилировать под win32-платформу.

В качестве приложения для примера кросс-компиляции я использую fancybrowser (qt-linux/qt/examples/webkit/fancybrowser), скопированный в папку «/home/caiiiycuk/qt-cross/fancybrowser». Как вы понимаете, можно использовать любой другой проект — просто глаз на него упал у меня 🙂

Таким образом, мы имеем:

  • Qt SDK для Linux, в папке «/home/caiiiycuk/qt-cross/qt-linux»
  • Qt SDK для Windows, в папке «/home/caiiiycuk/qt-cross/qt-win»
  • Тестовое приложение «fancybrowser», в папке «/home/caiiiycuk/qt-cross/fancybrowser»
  • Компилятор gcc/g++ 4.4.3 (поставляется вместе с Ubuntu)
  • Компилятор i586-mingw32msvc-gcc/i586-mingw32msvc-g++ (установили из репозитория Ubuntu)

Компилируем под Linux

Хорошо, начнем с простого — скомпилируем проект используя qt-linux (т.е. для linux системы):

//действия выполняются из каталога /home/caiiiycuk/qt-cross/fancybrowser
export QTDIR=/home/caiiiycuk/qt-cross/qt-linux/qt
export QMAKESPEC=/home/caiiiycuk/qt-cross/qt-linux/qt/mkspecs/linux-g++-32
$QTDIR/bin/qmake
make clean
make

Просто, не так ли? 🙂 На выходе получем исполняемый файл fancybrowser. Запустив его, увидим что-то вроде:

Компилируем под Windows

Вот и настало время компилировать под win32. Для начала создадим файл спецификации, объясняющий Qt как выполнять компиляцию под Windows. Для облегчения себе жизни скопируем уже существующий файл спецификации win32-g++

QMAKE_SH = sh

QMAKE_CC = i586-mingw32msvc-gcc

QMAKE_CXX = i586-mingw32msvc-g++

QMAKE_INCDIR_QT = /home/caiiiycuk/qt-cross/qt-win/qt/include
QMAKE_LIBDIR_QT = /home/caiiiycuk/qt-cross/qt-win/qt/lib

QMAKE_LINK = i586-mingw32msvc-g++
QMAKE_LINK_C = i586-mingw32msvc-gcc
QMAKE_LFLAGS = -mthreads -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mwindows

QMAKE_MOC = /home/caiiiycuk/qt-cross/qt-linux/qt/bin/moc
QMAKE_UIC = /home/caiiiycuk/qt-cross/qt-linux/qt/bin/uic
QMAKE_IDC = /home/caiiiycuk/qt-cross/qt-linux/qt/bin/idc

QMAKE_RC = i586-mingw32msvc-windres

QMAKE_STRIP = i586-mingw32msvc-strip

//действия выполняются из каталога /home/caiiiycuk/qt-cross/fancybrow
export QTDIR=/home/caiiiycuk/qt-cross/qt-win/qt
export QMAKESPEC=/home/caiiiycuk/qt-cross/qt-win/qt/mkspecs/win32-x-g++
/home/caiiiycuk/qt-cross/qt-linux/qt/bin/qmake
make clean
make

После успешной компиляции в папке release будет лежать заветный fancybrowser.exe. Всего и делов 🙂
Не забываем, что для запуска необходимо иметь требуемые dll (для fancybrowser — QtCore4.dll QtGui4.dll QtNetwork4.dll QtWebKit4.dll QtXmlPatterns4.dll phonon4.dll mingwm10.dll libgcc_s_dw2-1.dll). Эти библиотеки можно взять из папки qt-win/qt/bin но не из папки qt-win/bin. В результате должно получиться это:

Я не могу гарантировать, что это «true way» для кросс-компиляции qt-приложений, это только мои изыскания. Буду благодарен за любую критику 🙂 Работоспособность этого метода так же была проверена на OpenSuse и CentOS. Ubuntu была лучше лишь тем, что в её репозитории лежит mingw32 более поздней версии. Уж не знаю с чем это связанно — мелочь, а приятно.

Читайте также:  Linux rdp with gateway

Эти скрипты (для компиляции) могут быть легко интегрированны в Hudson, для облегчения сборки кросс-платформенных продуктов, но это уже тема для отдельной статьи. Всем спасибо 🙂

Источник

Кросс-компиляция Qt5 под Linux для Win x32/x64/static/shared

Документирование получения системы кросс-компиляции под Linux для Windows x32/x64/static/shared и сборка последней на момент описания Qt 5.4.1 в лайт-версии (для указанных четырех целей). Для себя, глубоко-обожаемого, ну и для пользы обществу.

Многие разработчики приходят к выводу, что использование *nix (в частности Linux) более предпочтительно для разработки приложений, используя фрэймворк Qt. И тому есть причины. Qt изначально ориентирована на *nix инструментарий, типа autotool, make, perl… И второй момент, под никсами есть прекрасный инструмент — valgrind, под виндой порта пока его не видел. Ну и последняя причина: просто удобно иметь набор инструментария для создания приложений под различные целевые платформы — в одном месте.

0. Сценарий сборки

Все шаги делаем последовательно. Желательно не объединять все скрипты в последовательную сборку по причине необходимости промежуточного «человечного» контроля. Разные дистрибутивы Линуха, разные среды исполнения, наборы инструментариев… Простой алгоритм: сделал очередной шаг, убедился в отсутствии ошибок, пошел делать следующий. Итак, сам сценарий:

  • 1. Предварительная подготовка
  • 2. Установка среды кросс-компиляции MXE
  • 3. Загрузка и настройка Qt 5.4.1
  • 4. Сборка комплектов Qt 5.4.1 для четырех целей (см. сабж)
  • 5. Прописка собранного в QtCreator

1. Предварительная подготовка

У вас установлен дистрибутив Линукса. Желательно все это делать на на продакшен-компе (не на живом Линуксе), а установленном в виртуальную машину. Я например, пользуюсь VMWare, но это дело вкуса. Выбор дистрибутива Линукса — так же дело вкуса. Лично я предпочитаю Gentoo Linux, собственно под ним всю эту кухню и настраиваю. Если есть сложности в настройке, у меня есть небольшая статейка по этому вопросу: «Установка и настройка Linux Gentoo под VMWare».

Итак, у вас есть настроенный Линукс и вы работаете не под рутом! Для дальнейшей работы вам нужно проверить присутствие следующих установленных пакетов, или доустановить:

Вся дальнейшая установка будет производиться в каталог $HOME/dev. Если у вас таковой присутствует — либо переименовываете его, либо внимательно правите скрипты, которые будут приведены далее. Для всех манипуляций со скачиваемыми внешними файлами/скриптами/библиотеками будет использован каталог $HOME/setup. Все замечания выше относительно $HOME/dev — в силе и к этому каталогу.

2. Установка среды кросс-компиляции MXE

Предварительное замечание об MXE. Это отличнейшая система сборки тулчейнов для кросс-компиляции. Но есть одно «но». В данный момент не существует стабильной ветки. Авторы до поры до времени вели две ветки в своем git-репозитарии — стабильную и «разработческую». Сейчас ветки объединены. Разработка идет ну очень активно — изменения сбрасываются чуть ли не раз 1-3 дня. А это чревато тем, что «то работает сборка, то не работает». Некоторые важные для меня библиотеки, в частности клиентская часть PostgreSQL, собираются без ошибок, но в нерабочем состоянии. Потратил неделю не исследование явных косяков. Исправляем эти «недочеты». Итак:

Должны получить в каталоге $HOME/setup следующий набор скриптов:

Источник

Оцените статью