Pull to refresh

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

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



Приступим, друзья

Начнем с того, что скачаем и установим родной Qt SDK (для Linux).
Как вариант — выполним в консоли:
wget get.qt.nokia.com/qtsdk/qt-sdk-linux-x86-opensource-2010.04.bin
chmod 777 qt-sdk-linux-x86-opensource-2010.04.bin
./qt-sdk-linux-x86-opensource-2010.04.bin
Я поставил 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:
sudo apt-get install mingw32
По окончании установки станет доступен тулкит 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++
cd qt-win/qt/mkspecs/
mkdir win32-x-g++
cp win32-g++/* win32-x-g++/

Внесем необходимые исправления в файл win32-x-g++/qmake.conf:
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 более поздней версии. Уж не знаю с чем это связанно — мелочь, а приятно.

Эти скрипты (для компиляции) могут быть легко интегрированны в Hudson, для облегчения сборки кросс-платформенных продуктов, но это уже тема для отдельной статьи. Всем спасибо :)
Tags:
Hubs:
Total votes 74: ↑69 and ↓5+64
Comments49

Articles