Эта мини-статья рассказывает об одном из способов осуществления кросс-компиляции приложений Qt для платформы win32.
Приступим, друзья
Начнем с того, что скачаем и установим родной Qt SDK (для Linux).
Как вариант — выполним в консоли:
wget get.qt.nokia.com/qtsdk/qt-sdk-linux-x86-opensource-2010.04.binЯ поставил Qt SDK Linux в папку "/home/caiiiycuk/qt-cross/qt-linux", так что будьте внимательны к путям.
chmod 777 qt-sdk-linux-x86-opensource-2010.04.bin
./qt-sdk-linux-x86-opensource-2010.04.bin
Следующий этап, пожалуй, самый проблематичный — нам нужно раздобыть скомпилированные библиотеки 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Просто, не так ли? :) На выходе получем исполняемый файл 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
Компилируем под 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После успешной компиляции в папке release будет лежать заветный fancybrowser.exe. Всего и делов :)
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
Не забываем, что для запуска необходимо иметь требуемые 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, для облегчения сборки кросс-платформенных продуктов, но это уже тема для отдельной статьи. Всем спасибо :)