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

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

Приступим

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

wget http://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, для облегчения сборки кросс-платформенных продуктов, но это уже тема для отдельной статьи. Всем спасибо 🙂

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s