Инструменты пользователя

Инструменты сайта


// Qt4 и кросскомпиляция для win32

Попытаюсь пошагово оформить инструкцию, как делал у себя.

Для начала ставим пакеты (верно для ArchLinux, для других названия будут или аналогичными, или похожими):

pacman -S mingw32-binutils mingw32-gcc mingw32-runtime mingw32-w32api qt wine

Далее, мы должны взять Windows-версию библиотеки Qt4. Берем отсюда (текущая версия 4.6, хотя лучше взять ту, которая у вас в дистрибутиве, в момент написания, это: 4.5.3, кроме того, берем ту, что дял MinGW и, мы же православные, LGPL):
http://qt.nokia.com/downloads/windows-cpp (получим самую последнюю версию)

или отсюда:
http://get.qt.nokia.com/qt/source/

Я беру 4.5.3:

wget -c http://get.qt.nokia.com/qt/source/qt-win-opensource-4.5.3-mingw.exe

После скачивания, нам поможет wine, дабы установить библиотеку1). Если у вас возникают какие ошибки и wine отваливается, попытайтесь удалить каталог ~/.wine и запустить процесс заново.

Предварительно делаем такой финт ушами:

ln -s /usr/i486-mingw32 ~/.wine/drive_c/MinGW

Пусть потом установщик думает, что у нас реальный MinGW стоит, в частности - библиотека mingwm10.dll, которую вы должны предоставить в целевой используемой системе, как и необходимые dll от Qt.

Итак:

wine qt-win-opensource-4.5.3-mingw.exe

В ходе установки локации выбирайте умолчательный - не нужно мнить себя умнее паровоза и повышать энтропию. Когда будет спрошено где установлен MinGW - жмите просто Next, если ругнется, жмите Ok - нам не страшно. По окончании сего увлекательного процесса нащупать библиотеку можно в каталоге

~/.wine/drive_c/Qt/VERSION

где VERSION это версия, в нашем случае - 4.5.3

Далее, для своего удобства, хотя это может и быть идеологически неверным, я делаю следующие пассы от root:

(1) mkdir /opt/qt4-win32
(2) cp -a /home/USER/.wine/driver_c/Qt/VERSION /opt/qt4-win32/
(3) ln -s /opt/qt4-win32/VERSION /opt/qt4-cross

где (1) - создаие каталога в общедоступной системной директории, (2) - копирование нашей установленной версии Qt4 в этот самый общедоступный каталог (USER - имя пользователя от которого происходила установка), (3) - делаем симлинк на нашу рабочую версию, этот симлинк я буду использовать в описании spec-файла для qmake.

Следующий шаг, создание спека для Qmake (любителям других систем сборок - велком с дополнениями).

Хотя создание это громко сказано, в комплекте поставки есть спек:

/usr/share/qt/mkspecs/win32-g++

для работы с mingw32 в среде Windows, нам надо его только немного модифицировать, поэтому делаем копию:

cp -a /usr/share/qt/mkspecs/win32-g++ /usr/share/qt/mkspecs/win32-cross-g++

Переходим в /usr/share/qt/mkspecs/win32-cross-g++ и, можно наложить такой патч, бай ми:

diff -Nur win32-g++/qmake.conf win32-cross-g++/qmake.conf
--- win32-g++/qmake.conf	2009-10-08 09:30:49.000000000 +1100
+++ win32-cross-g++/qmake.conf	2009-04-10 13:56:14.809651570 +1100
@@ -14,7 +14,7 @@
 QMAKE_EXT_OBJ           = .o
 QMAKE_EXT_RES           = _res.o
 
-QMAKE_CC		= gcc
+QMAKE_CC		= i486-mingw32-gcc
 QMAKE_LEX		= flex
 QMAKE_LEXFLAGS		=
 QMAKE_YACC		= byacc
@@ -27,7 +27,7 @@
 QMAKE_CFLAGS_DEBUG	= -g
 QMAKE_CFLAGS_YACC	= -Wno-unused -Wno-parentheses
 
-QMAKE_CXX		= g++
+QMAKE_CXX		= i486-mingw32-g++
 QMAKE_CXXFLAGS		= $$QMAKE_CFLAGS
 QMAKE_CXXFLAGS_DEPS	= $$QMAKE_CFLAGS_DEPS
 QMAKE_CXXFLAGS_WARN_ON	= $$QMAKE_CFLAGS_WARN_ON
@@ -41,18 +41,18 @@
 QMAKE_CXXFLAGS_EXCEPTIONS_ON = -fexceptions -mthreads
 QMAKE_CXXFLAGS_EXCEPTIONS_OFF = -fno-exceptions
 
-QMAKE_INCDIR		=
-QMAKE_INCDIR_QT		= $$[QT_INSTALL_HEADERS]
-QMAKE_LIBDIR_QT		= $$[QT_INSTALL_LIBS]
+QMAKE_INCDIR		= /usr/i486-mingw32/include
+QMAKE_INCDIR_QT		= /opt/qt4-cross/include
+#QMAKE_INCDIR_QT         = /usr/include
+QMAKE_LIBDIR_QT		= /opt/qt4-cross/lib
 
 QMAKE_RUN_CC		= $(CC) -c $(CFLAGS) $(INCPATH) -o $obj $src
 QMAKE_RUN_CC_IMP	= $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
 QMAKE_RUN_CXX		= $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src
 QMAKE_RUN_CXX_IMP	= $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
 
-QMAKE_LINK		= g++
-QMAKE_LINK_C		= gcc
-QMAKE_LFLAGS		= -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
+QMAKE_LINK		= i486-mingw32-g++
+QMAKE_LFLAGS		= -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mwindows
 QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads -Wl
 QMAKE_LFLAGS_EXCEPTIONS_OFF =
 QMAKE_LFLAGS_RELEASE	= -Wl,-s
@@ -72,35 +72,26 @@
 QMAKE_LIBS_COMPAT       = -ladvapi32 -lshell32 -lcomdlg32 -luser32 -lgdi32 -lws2_32
 QMAKE_LIBS_QT_ENTRY     = -lmingw32 -lqtmain
 
-!isEmpty(QMAKE_SH) {
-    MINGW_IN_SHELL      = 1
-	QMAKE_DIR_SEP		= /
-	QMAKE_COPY		= cp
-	QMAKE_COPY_DIR		= xcopy /s /q /y /i
-	QMAKE_MOVE		= mv
-	QMAKE_DEL_FILE		= rm
-	QMAKE_MKDIR		= mkdir
-	QMAKE_DEL_DIR		= rmdir
-    QMAKE_CHK_DIR_EXISTS = test -d
-} else {
-	QMAKE_COPY		= copy /y
-	QMAKE_COPY_DIR		= xcopy /s /q /y /i
-	QMAKE_MOVE		= move
-	QMAKE_DEL_FILE		= del
-	QMAKE_MKDIR		= mkdir
-	QMAKE_DEL_DIR		= rmdir
-    QMAKE_CHK_DIR_EXISTS	= if not exist
-}
-
-QMAKE_MOC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}moc.exe
-QMAKE_UIC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}uic.exe
-QMAKE_IDC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}idc.exe
+
+MINGW_IN_SHELL      = 1
+QMAKE_DIR_SEP		= /
+QMAKE_COPY		= cp
+QMAKE_COPY_DIR		= cp -a
+QMAKE_MOVE		= mv
+QMAKE_DEL_FILE		= rm -rf
+QMAKE_MKDIR		= mkdir -p
+QMAKE_DEL_DIR		= rm -rf
+QMAKE_CHK_DIR_EXISTS = test -d
+
+QMAKE_MOC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}moc
+QMAKE_UIC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}uic
+QMAKE_IDC		= $$[QT_INSTALL_BINS]$${DIR_SEPARATOR}idc
 
 QMAKE_IDL		= midl
 QMAKE_LIB		= ar -ru
-QMAKE_RC		= windres
+QMAKE_RC		= i486-mingw32-windres
 QMAKE_ZIP		= zip -r -9
 
-QMAKE_STRIP		= strip
+QMAKE_STRIP		= i486-mingw32-strip
 QMAKE_STRIPFLAGS_LIB 	+= --strip-unneeded
 load(qt_config)

или на основании этого патча, внести изменения самостоятельно.

Видно, что основные отличия это:

  • указание компилятора
  • указание путей
  • указание разделителя директорий (принудительно) и системных команд, типа копирования или переименования.

На основе этого можете делать свои правки, готовый файл спека, кому нужно - вышлю.

Второй файл qplatformdefs.h в редактировании не нуждается.

После этого следует замечание: в .pro-файле среди аргументов параметра CONFIG, не должно быть debug, и ставить туда release, иначе сборка завершается ошибкой. Почему - не разбирался, кто решит проблему - отпишите.

Ну и последние акт, запускаем qmake так:

qmake -spec win32-cross-g++ file.pro
make

Вот собственно и все, если код написан правильно и корректно, то все должно собраться и слинковаться.

PS повторюсь: не забудьте в дистрибуцию добавить нужные для работы DLL в частности mingwm10.dll (его можно взять из поставки mingw32)

PPS Полезная ссылка для Арч-юзеров, вообще для кросскомпиляции: http://aur.archlinux.org/packages.php?K=mingw32, там в том числе есть пакет mingw32-qt, в первом коменте к которому PKGBUILD собирающий пакет с Qt 4.5.3 для mingw32

1) в общем мы можем взять копию установки с какой нить Windows-машины, разницы никакой, или попытаться собрать самому из исходников

Комментарии