Qt и кросскомпиляция в Kubuntu 9.04. Заметка 1.

Естественно тема обсуждалась многими и во многих местах, но каждый из нас тратил время чтобы изучить новую для себя технологию, или вспомнить старое. Эту заметку я надумал тут оставить хотя бы для себя, чтобы без лишних мучений заново настроить свой Qt если все заново придется настраивать если конфиги растеряю.
Уже больше года занимаясь программированием на Qt, я давно планировал купить Windows, дабы компилировать на нем лицензионные программы под эту платформу. Windows был бы нужен только для компиляции и ни для чего больше. Все что меня интересует я давно нашел в линуксе.
Краем уха слышал что лазарус поддерживает кросскомпиляцию, но не удивился, при их подходе все пихать в бинарник - это вполне естественно, подумал я. Но в один прекрасный день я открыл nigma.ru и вбил туда "кросскомпиляция Qt". С этого и началась вся история...

Во-первых, я использую qt-sdk, да так, чтобы в нем никаких либов от kde не подгружалось без спроса, ибо либы эти - gpl, а это для меня не желательно. Лежит SDK в папке: /opt/qtsdk-2009.03 . Будем считать что ваш qt-sdk лежит в той же папке. Тогда у вас должна быть и такая папка: /opt/qtsdk-2009.03/qt/mkspecs/win32-g++. Там лежат спеки для компиляции в mingw. Для настройки спека на кросскомпиляцию достаточно поправить файл qmake.conf, лежащий в этой папке, для этого достаточно изменить следующие строки:
QMAKE_CXX = i586-mingw32msvc-g++

QMAKE_INCDIR = /usr/i586-mingw32msvc/include/
QMAKE_INCDIR_QT = /wine_c/Qt/2009.03/qt/include/
QMAKE_LIBDIR_QT = /wine_c/Qt/2009.03/qt/lib/

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

QMAKE_DIR_SEP = /
QMAKE_COPY = cp
QMAKE_COPY_DIR = cp -r
QMAKE_MOVE = mv
QMAKE_DEL_FILE = rm -f
QMAKE_MKDIR = mkdir -p
QMAKE_DEL_DIR = rm -rf

QMAKE_RC = i586-mingw32msvc-windres

QMAKE_ZIP = zip -r -9

QMAKE_STRIP = i586-mingw32msvc-strip

Но это конечно же не следует делать бездумно. Бинарники i586-mingw32msvc-strip, i586-mingw32msvc-g++ и т.д. должны быть установлены. Для этого необходимо открыть пакетный менеджер и поставить пакеты: mingw32, mingw32-binutils, mingw32-runtime.
Папки: /wine_c/Qt/2009.03/qt/include/ и /wine_c/Qt/2009.03/qt/lib/ - это папки инклудов и библиотек windows-версии Qt, которые могут быть установлены посредством установки windows версии qt-sdk через wine, при этом в ыше предполагалось, что /wine_c - это ссылка на папку ~/.wine/dosdevices/c\:, то есть на диск c.
Итак, если все сделано правильно, то для компиляции windows-приложения достаточно в папке с проектным файлом выполнить:
/opt//qtsdk-2009.03/qt/bin/qmake -spec win32-g++
make

Все это довольно просто, хотя этот мануал и не позволит вам вслепую копировать приведенный алгоритм. Разве что вы поставите qt в папку /opt/qtsdk-2009.03/ и сделаете ссылку /wine_c, тогда прямое выполнения алгоритма задачу решит, но не иначе.

Это лишь первая заметка о кросскомпиляции, в последующих будет рассмотрено:

  • Настройка wine или проектов для запуска полученных windows-приложений в wine
  • Настройка проекта в QtCreator для поддержки "одновременно" нативной и кросскомпиляции и автоматического запуска соответственно linux или windows сборок программы
  • Кросскомпиляция динамических библиотек, драйвера qsqlpsql4.dll, библиотеки qwt5.dll

Комментарии (3)

0
Soi-Fong - 28 Октябрь, 2009 - 21:44
Изображение пользователя Soi-Fong.

Спасибо за полезную статью! Жаль такой не было, когда я задавался этим вопросом. Я тогда достойных русских манов по кросскомпиляции не нашел, и у меня сложилось впечатление, что таким гемором никто не занимается, и все компилят либо на винде, либо под вайном (как и я). Теперь гугл будет знать куда слать )

0
Voyageur - 28 Октябрь, 2009 - 22:58
Изображение пользователя Voyageur.

Очень хорошая и умная статья! Сам занимаюсь кросс-компиляцией, только немного в другой области, поэтому тема для меня очень интересная! Жду еще))

0
GMar - 29 Октябрь, 2009 - 10:05

Спасибо. Постараюсь не тянуть с продолжением.

Отправить комментарий

CAPTCHA на основе изображений
Введите цифры