magist3r 05.09.2011 20:44

How-to`s[Qt] Кросс-компиляция проекта под windows из под openSUSE

Добрый вечер, уважаемые знатоки! Как я вижу, месяц полезных статей еще никто не открыл, поэтому возьму на себя смелость сделать это. Итак, приступим.

Вступление

Сам я учусь в универе, и моя специальность, пусть и косвенно, связана с кодингом. Так как я уже несколько лет как Ъ-линуксоид (а не дуалбутчик там какой-нибудь), то я решил использовать нечто кроссплатформенное, а именно Qt. Но вокруг меня везде линукс (настраивать компиляцию проектов на мамином ноутбуке с виндой меня явно не устраивает), а в универе везде винда. Поэтому встал вопрос кросс-компиляции. Разберем весь процесс от настройки окружения до компиляции на примере openSUSE.

Часть материала взята из этой статьи. Итак, поехали.

Первое, что нам необходимо сделать, это добавить репозиторий mingw:
1
sudo zypper ar -n "mingw" "http://download.opensuse.org/repositories/windows:/mingw:/win32/openSUSE_11.4/" mingw


И тут нас ждет первый сюрприз. И, надо сказать, приятный. В данном репозитории помимо кросс-компилятора обнаруживается скомпиленная библиотека Qt под винду. А это означает, что качать и ставить Qt SDK нет необходимости.

Второе, ставим необходимые пакеты:
1
sudo zypper in mingw32-cross-gcc mingw32-cross-gcc-g++ mingw32-libqt4-devel


Все остальные зависимости подтянутся автоматически.

Третье, и самое главное, это настройка конфига для qmake. В основном для редактирования конфига я пользовался вышеприведенной статьей. Делаем так:
1
2
3
4
cd /usr/share/qt4/mkspecs
sudo cp -r win32-g++ win32-x-g++
cd win32-x-g++
vim qmake.conf


То есть за основу берем стандартный конфиг для винды. Я оставлю тут diff win32-g++/qmake.conf win32-x-g++/qmake.conf:
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
17c17
< QMAKE_CC = gcc
---
> QMAKE_CC = /usr/bin/i686-w64-mingw32-gcc
30c30
< QMAKE_CXX = g++
---
> QMAKE_CXX = /usr/bin/i686-w64-mingw32-g++
45,46c45,46
< QMAKE_INCDIR_QT = $$[QT_INSTALL_HEADERS]
< QMAKE_LIBDIR_QT = $$[QT_INSTALL_LIBS]
---
> QMAKE_INCDIR_QT = /usr/i686-w64-mingw32/sys-root/mingw/include
> QMAKE_LIBDIR_QT = /usr/i686-w64-mingw32/sys-root/mingw/lib
53,55c53,55
< QMAKE_LINK = g++
< QMAKE_LINK_C = gcc
< QMAKE_LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
---
> QMAKE_LINK = /usr/bin/i686-w64-mingw32-g++
> QMAKE_LINK_C = /usr/bin/i686-w64-mingw32-gcc
> QMAKE_LFLAGS = -Wl,-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
96,98c96,98
< 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
---
> QMAKE_MOC = /usr/bin/moc
> QMAKE_UIC = /usr/bin/uic
> QMAKE_IDC = /usr/bin/idc
102c102
< QMAKE_RC = windres
---
> QMAKE_RC = /usr/bin/i686-w64-mingw32-windres
105c105
< QMAKE_STRIP = strip
---
> QMAKE_STRIP = /usr/bin/i686-w64-mingw32-strip


То есть по сути заменяем стандартный компилятор на кросс-компилятор. Полный текст конфига тут.

Ну все, все настроено, можно конпелять. Переходим в папку с проектом и делаем в ней:
1
2
qmake -r -spec win32-x-g++
make -w


И тут нас ждет еще один сюрприз, на сей раз неприятный. make вываливается с ошибкой:
1
2
/usr/lib/gcc/i686-w64-mingw32/4.6.1/../../../../i686-w64-mingw32/bin/ld: cannot find -lQtGui
/usr/lib/gcc/i686-w64-mingw32/4.6.1/../../../../i686-w64-mingw32/bin/ld: cannot find -lQtCore


К сожалению, я не нашел, где поменять опции для ld, если кто знает, буду признателен за подсказку. А пока мы пойдем другим путем, ведь лабу надо показать уже завтра, а у нас, видите ли, не конпеляется:
1
2
3
cd /usr/i686-w64-mingw32/sys-root/mingw/lib
sudo ln -s libQtGui4.a libQtGui.a
sudo ln -s libQtCore4.a libQtCore.a


Не знаю, чей это косяк, но факт в том, что для всех используемых кутишных либ нужно сделать симлинк без четверки. После этого все должно собраться и в папке release появится долгожданный exe'шник.

Ну, вроде, почти все. Осталось только скинуть в папку с exe'шником необходимые dll. К счастью, ничего конпелять не нужно, либы лежат по адресу /usr/i686-w64-mingw32/sys-root/mingw/bin/. Узнать, какие либы необходимы, быстрее всего с помощью wine:
1
wine my_project.exe



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



Тэги: cross compilation Linux qt Windows
+ 17 -
Похожие Поделиться

kozzy 05.09.2011 21:08 #
Спасибо за статью!
enot 06.09.2011 11:20 #
а не дуалбутчик там какой-нибудь

как будто что-то плохое


если кому-то интересно, могу написать аналогичную статью по кроскомпиляции GTK2 (но особо не вижу в этом смысле, в интернетах подобногоых говна статей тонны).
dront78 06.09.2011 12:49 #
добавлю +1 к статье о кросскомпиляции вообще

в .bashrc

function gcc-switch {
export NM=$1-nm
export LD=$1-ld
export CC=$1-gcc
export CXX=$1-g++
export RANLIB=$1-ranlib
export AR=$1-ar
export AS=$1-as
export STRIP=$1-strip
export OC=$1-objcopy
}

после чего переключение в текущей сессии происходит например
gcc-switch arm-eabi
или
gcc-switch i686-w64-mingw32

кроме того есть $CXXFLAGS (для g++) $CFLAGS (для gcc) $LDFLAGS (для LD), меняющие параметры сборки. для каждого toolchain они могут быть специфичны, но могут и совпадать
magist3r 06.09.2011 13:29 #
Спасибо, полезно.
andreas 13.09.2011 00:04 #
Большое мерси! В федоре всё чуть-чуть по-другому, но важна идея.