Кросскомпиляция Qt-4.8.0 под mingw32 (x86) в Gentoo (x86_64)

image
Нет никакой необходимости устанавливать Qt заранее на целевую систему, не нужно тянуть предварительно скомпилированные библиотеки для Windows.

Я проделал данный трюк на двух платформах, на Gentoo x86_64 установленной на VitualBox c оболочкой KDE 4.8 и соответвующими библиотеками Qt, и на домашнем сервере Gentoo x86_64 (Intel® Core(TM) i5 CPU 760 @ 2.80GHz) без какой либо графической оболочки и без предустановленных библиотек Qt.

Настройка кросс-компилятора

В принципе для кросс-компиляции понадобятся следующие утилиты:
  • mingw32-g++
  • mingw32-gcc
  • mingw32-ar
  • mingw32-ld
  • mingw32-strip
  • mingw32-windres
И пакеты:
  • binutils
  • gcc
  • w32api
  • mingw-runtime
Привожу пример для Gentoo, думаю что для других дистрибутивов возможно есть аналогичные инструкции по установке и настройке ming32 (x86).

Для дистрибутива Gentoo инсталляция кросс-компилятора проста:

В случае если не установлен пакет app-portage/layman, необходимо сделать следующие операции:

# emerge layman
# mkdir /usr/local/portage
# echo ‘PORTDIR_OVERLAY=”/usr/local/portage/”’ >> /etc/make.conf
# echo ‘source /var/lib/layman/make.conf’ >> /etc/make.conf
# env-update


Для установки mingw32 cross toolchain:

# emerge crossdev portage-utils
# crossdev -t i686-pc-mingw32


С компиляцией 4.8.0 связано как минимум три момента:
  1. Без zlib проект не соберется
  2. Без libiconv проект не соберется
  3. Есть баг связанный с поддержкой планшетников
Сборка и установка необходимых библиотек

Я не стал пользоваться утилитой i686-pc-mingw32-emerge, по трём причинам:
  • libiconv у меня скомпилировался, но отказался устанавливатся, а после долгих неудачных манипуляций в попытке переписать ebuild для qt-core, у меня пропало желание танцевать еще и с ebuild для libiconv.
  • Пусть в руководстве будет хотя бы два универсальных способа установки требуемых библиотек.
  • Пришлось бы просто выложить в общий доступ кучу патчей безо всякой статьи.
! Внимание! данная сборка для PREFIX=i686-pc-mingw32-, название компилятора и утилит на другой системе может отличаться. Соответственно корневой директорией для данной сборки является директория /usr/i686-pc-mingw32, и соответвенно все include файлы и lib файлы устанавливаются в /usr/i686-pc-mingw32/usr/include, /usr/i686-pc-mingw32/lib.


Я собирал в своей домашней папке, права root нам понадобятся только для установки библиотек.

Устанавливаем zlib:

$ cd
$ wget www.zlib.net/zlib-1.2.6.tar.gz
$ tar -zxf zlib-1.2.6.tar.gz
$ cd zlib-1.2.6
$ CC=i686-pc-mingw32-gcc LDSHARED=i686-pc-mingw32-gcc CPP="i686-pc-mingw32-gcc -E" AR=i686-pc-mingw32-ar RANLIB=i686-pc-mingw32-ranlib ./configure --prefix=/usr/i686-pc-mingw32/

# make && make install

Устанавливаем iconv:

$ cd
$ wget ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
$ tar -zxf libiconv-1.14.tar.gz
$ cd libiconv-1.14
$ ./configure --enable-static --disable-shared --build=x86_64-pc-linux-gnu --host=i686-pc-mingw32 --prefix=/usr/i686-pc-mingw32/ LDFLAGS="-Wl,-elf2flt" CC="i686-pc-mingw32-gcc"

# make && make install


Сборка Qt-4.8.0

Далее, мы переходим к сборке Qt:

$ cd
$ wget download.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.8.0.tar.gz
$ tar -zxf qt-everywhere-opensource-src-4.8.0.tar.gz
$ cd qt-everywhere-opensource-src-4.8.0
$ wget pastebin.com/download.php?i=CAjgyASQ -O qapplication_win.cpp.patch
$ patch -p0 -i qapplication_win.cpp.patch

Смысл данного патча исправить баг с QT_NO_TABLET, QT_NO_TABLETEVENT. Здесь дело в том что флаг QT_NO_TABLET убирает определение QTabletDeviceData из заголовочного файла qapplication_p.h

#ifndef QT_NO_TABLET
struct QTabletDeviceData
{


Тем не менее в файле qapplication_win.cpp есть 4 строчки, которые используют QTabletDeviceData, поэтому соответствующие места в коде были обернуты в #ifndef QT_NO_TABLET.Не ручаюсь за “правильность” такой обертки, но мне она понадобилась, чтобы благополучно скомпилировать Qt.

И наконец файл mkspec для mingw32:
$ wget pastebin.com/raw.php?i=uPMXC6cD -O qmake.conf

Тем у кого другой префикс для кросс инструментария необходимо внести в файл соответствующие исправления.

После этого копируем файл:
$ cp qmake.conf mkspecs/win32-g++/qmake.conf

Настраиваем:
$ ./configure -prefix /usr/i686-pc-mingw32/usr -bindir /usr/i686-pc-mingw32/usr/bin -libdir /usr/i686-pc-mingw32/usr/lib/qt4 -docdir /usr/i686-pc-mingw32/usr/share/doc/qt-4.8.0 -headerdir /usr/i686-pc-mingw32/usr/include/qt4 -plugindir /usr/i686-pc-mingw32/usr/lib/qt4/plugins -importdir /usr/i686-pc-mingw32/usr/lib/qt4/imports -datadir /usr/share/qt4 -translationdir /usr/share/qt4/translations -sysconfdir /etc/qt4 -examplesdir /usr/share/qt4/examples -demosdir /usr/share/qt4/demos -opensource -confirm-license -shared -fast -largefile -stl -verbose -xplatform win32-g++ -nomake examples -nomake demos -release -no-separate-debug-info -exceptions -no-rpath -no-pch -reduce-relocations -arch windows -no-accessibility -no-xmlpatterns -no-multimedia -no-audio-backend -no-phonon -no-phonon-backend -no-svg -no-webkit -no-script -no-scripttools -no-declarative -system-zlib -no-gif -no-libtiff -no-libpng -no-libmng -no-libjpeg -no-cups -no-dbus -no-gtkstyle -no-nas-sound -no-opengl -no-sm -no-xshape -no-xvideo -no-xsync -no-xinerama -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-mitshm -no-fontconfig -no-freetype -no-xinput -no-xkb -no-glib -iconv -no-optimized-qmake -no-openssl -no-qt3support

Компилируем:
$ make -j$((`cat /proc/cpuinfo | grep processor | wc -l`+1))

На моем домашнем сервере с процессором Intel® Core(TM) i5 CPU 760 @ 2.80GHz, собралось достаточно быстро.

Устанавливаем библиотеки и инструменты:

# make install

У меня почему-то не установился qmake в соответствующую директорию, пришлось скопировать

# cp bin/qmake /usr/i686-pc-mingw32/usr/bin/qmake

Тестирование

$ cd
$ cp -r qt-everywhere-opensource-src-4.8.0/examples/tutorials/addressbook addressbook
$ cd addressbook
$ /usr/i686-pc-mingw32/usr/bin/qmake -spec win32-g++
$ make
$ ls part7/release/part7.exe
part7/release/part7.exe


Появился исполняемый файл.

Далее вы можете протестировать его в wine, но лучше скопировать исполняемый файл вместе с библиотеками на компьютер с ОС Windows для более чистого эксперимента. Я тестировал под Windows 7 (x64). Если у вас настроена samba, то можно просто скопировать всё необходимое в папку и запустить.

$ cp part7/release/part7.exe /var/samba/files/build/
$ cp `find / -name libstdc++-6.dll 2> /dev/null` /var/samba/files/build/libstc++-6.dll
$ cp `find / -name libgcc_s_sjlj-1.dll 2> /dev/null` /var/samba/files/build/libgcc_s_sjlj-1.dll
$ cp /usr/i686-pc-mingw32/usr/bin/*.dll /var/samba/files/build/


Запускаем:



Искренне надеюсь, что Вы видите тоже самое и данная статья для Вас интересна.

Поддержка libmysql

К сожалению, кросскомпиляция mysql-connector-c тянет на отдельную статью. Можно использовать заранее скомпилированные библиотеки и воспользоваться следующим руководством — www.qtcentre.org/wiki/index.php?title=Building_the_QMYSQL_plugin_on_Windows_using_MinGW.

Обращение к пользователям Gentoo от пользующегося Gentoo

Скорей всего в ближайшее время возьмусь за ebuild для qt-core, но пока не имею достачно сил и времени.
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама
Комментарии 30
  • +1
    Гм… А я под вайном SDK установил и не стал заморачиваться. Наверное, оттенок моих глаз всё ещё недостаточно красный.
    • +2
      wine это автоматически X-сы, иначе вы никак SDK не установите, а зачем вам на сервере X?
      • 0
        Установщик в любом случае под вайном собирается, а держать запущенным VNC-сервер на локальном порту мне не особо проблемно.
        • 0
          То есть вы предлагаете для кросс компиляции приложений, вначале собрать KDE, потом wine, еще и установить VNC, ах да про Qt еще забыл, и после этого называете меня «красноглазиком»? :)
          • 0
            Вы поймите, у меня там сервер сборки под форточки, 4 дистра и макось. Если нашлось место на 9 chroot-окружений, уже всё равно, сколько софта установлено, ставлю ведь не я, а пакетный менеджер.
            • +1
              Вот-вот, мне тоже данная сборка понадобилась для организации Nightbuild Factory на рабочем сервере. Но я привык экономить место, процессорное время, и точно знать, что где и как у меня установлено.
    • +1
      наконец-то я смогу настроить ночные билды для своего проекта, спасибо
      • 0
        Тема кросскомпиляции очень интересна, хотелось бы увидеть статью про libmysql.
        • 0
          Ой… как мне все это знакомое и родное…
          • 0
            ох, как я вижу, у некоторых выходные зря не проходят.
            • 0
              Вы слишком высокого мнения обо мне, к сожалению это заняло больше времени нежели одни выходные.
            • 0
              С no-webkit и no-phonon как-то грустно, а ещё cmake в таком режиме не умеет fixup_bundle делать.
              • 0
                С phonon не уверен, а вот webkit вроде нормально собирается, сейчас попробую.
                • 0
                  С phonon как раз все получается, но там косяк в том, что не собирается dshow бэкенд. В арче в ауре валяются dx хедеры от вайна с которыми фонон собирается с этим плагином. Можно их отодрать и ебилд написать.
                  • 0
                    А вот это уже интересно. Пожалуй поковыряюсь. Сейчас мне надо кой какую работу завершить, так что приступлю 9-10.
                    • 0
                      Можно еще никакие бекенды не собирать, а собирать голый фонон и отдельно phonon vlc вместе с libvlc.
                      Или же попробовать осилить сборку gstreamer'а.
                  • 0
                    $ ls -la lib/ | grep dll
                    -rwxr-xr-x 1 maquefel users 319488 Mar 4 11:26 phonon4.dll
                    -rwxr-xr-x 1 maquefel users 3037184 Mar 4 11:20 QtCore4.dll
                    -rwxr-xr-x 1 maquefel users 11045376 Mar 4 11:26 QtGui4.dll
                    -rwxr-xr-x 1 maquefel users 1225728 Mar 4 11:20 QtNetwork4.dll
                    -rwxr-xr-x 1 maquefel users 254976 Mar 4 11:20 QtSql4.dll
                    -rwxr-xr-x 1 maquefel users 124928 Mar 4 11:20 QtTest4.dll
                    -rwxr-xr-x 1 maquefel users 24347648 Mar 4 12:30 QtWebKit.dll
                    -rwxr-xr-x 1 maquefel users 387072 Mar 4 11:20 QtXml4.dll

                    Вроде получилось, но как то кривовато, проверять надо.
                    • 0
                      i686-pc-mingw32-g++ -c -pipe -Wall -Wextra -Wreturn-type -fno-strict-aliasing -Wcast-align -Wchar-subscripts -Wformat-security -Wreturn-type -Wno-unused-parameter -Wno-sign-compare -Wno-switch -Wno-switch-enum -Wundef -Wmissing-noreturn -Winit-self -O2 -frtti -fexceptions -mthreads -DUNICODE -DQT_LARGEFILE_SUPPORT -DNDEBUG -DBUILDING_QT__=1 -DNDEBUG -DTESTS_SOURCE_DIR=\"/home/sauron/develop/packages/qt4/src/3rdparty/webkit/Source/WebKit/qt/tests/\" -DQT_DLL -DQT_NO_DEBUG -DQT_DECLARATIVE_LIB -DQT_WEBKIT_LIB -DQT_TESTLIB_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_HAVE_SSE3 -DQT_HAVE_SSSE3 -DQT_HAVE_SSE4_1 -DQT_HAVE_SSE4_2 -DQT_HAVE_AVX -DQT_THREAD_SUPPORT -I'../../../../../../../../include/QtCore' -I'../../../../../../../../include/QtNetwork' -I'../../../../../../../../include/QtGui' -I'../../../../../../../../include/QtTest' -I'../../../../../../../../include/QtWebKit' -I'../../../../../../../../include/QtDeclarative' -I'../../../../../../../../include' -I'../../tests' -I'../../Api' -I'../../../../../Source' -I'../../../../../include' -I'../../../../include/QtWebKit' -I'../../../../include' -I'../../../../../../../../include/ActiveQt' -I'.moc/release-shared' -I'.uic/release-shared' -I'../../../../../../../../mkspecs/unsupported/win32-g++-cross' -o .obj/release-shared/widget.o widget.cpp
                      In file included from widget.cpp:24:0:
                      .uic/release-shared/ui_widget.h:23:20: фатальная ошибка: widget.h: Нет такого файла или каталога
                      компиляция прервана.
                      make[4]: *** [.obj/release-shared/widget.o] Ошибка 1
                      make[4]: Выход из каталога `/home/sauron/develop/packages/qt4/src/3rdparty/webkit/Source/WebKit/qt/tests/hybridPixmap'
                      make[3]: *** [release] Ошибка 2
                      make[3]: Выход из каталога `/home/sauron/develop/packages/qt4/src/3rdparty/webkit/Source/WebKit/qt/tests/hybridPixmap'
                      make[2]: *** [sub-hybridPixmap-make_default] Ошибка 2
                      make[2]: *** Ожидание завершения заданий..


                      Почему-то пытается собрать тесты и валится на них.
                  • 0
                    ЗЫ
                    С ебилдами в принципе могу помочь, но всё-таки я хочу в процессе победить и вебкит и phonon. Phonon у меня кстати собирался, а вебкит в какой-то из версий кутей да, в какой-то версии нет.
                    • 0
                      Буквально 2 недели назад перешел на Qt 4.8 с webkit2.2.

                      Под виндой теперь phonon отключен и чтобы в HTML5 заработали звуки и видео требуется пакет multimedia из QtMobility, который под виндой не собирается в дебаге, так что пришлось подтягивать правленные сорцы с гита.
                      Неделю возился т.к. документашки в нормальном виде не нашел и пришлось вникать в скрипт конфигурации и в файлы описания пректа. Теперь все работает без проблем. Только одна беда — нельзя указать QtMobility относительный путь и пара dll подключаются из фиксированного пути, что есть сакс. Пока решил не возиться с переписыванием сорцов.

                      Под лином все собралось без проблем и заработало из коробки.
                      Phonon в WebKit2.2 не используется. Используется та же multimedia, а в случае ее отсуствия — gstreamer (он у меня и подхватился).

                      Говорит нам это о том, что фри софт, как бы хорош он ни был, гемора может доставить не меньше чем радости. Ну да ладно…
                      • 0
                        Вот кстати насчет вебкита, то нам в кутиме он бы с рабочей мультимедией очень пригодился бы. В общем нужно придумать где бы собраться нам всем и начать таки заполнение оверлея для Генты.
                        ЗЫ
                        Хорошо бы ещё обертку над cmake'ом сделать по аналогии с тем как её в openSUSE сделали.
                        • 0
                          пакет multimedia, поставляемый с Qt давно не поддерживается. Так что без отдельной QtMobility пока не обойтись. Максимум можно ее запихать в 3rdparty и добавить к сборке Qt. Но тут проблема — configure под виндой не поправишь — там исполняемый файл, а не скрипт. Так что пока собираю отдельно.
                      • 0
                        С ebuild конечно надо попробовать, когда займусь, обязательно попрошу вас о помощи. Тем более, что на профильных форумах меня не соизволили даже послать в man.
                        • 0
                          У меня есть некоторый опыт в написании ебилдов и даже умею делать ебилды с патчами сырцов. Я так думаю, что это нам точно пригодится. Плюс можно заодно попробовать и mingw64 осилить.
                          • 0
                            Может не стоило угрожать расправой?
                        • 0
                          Кстати а нет ни у кого желания попробовать на возможность кросскомпиляции Qt5?
                          • 0
                            А в чем проблема собственно? Соберется, только время потратим и сделаем цвет глаз чуть более равномерно красным.
                            • 0
                              Ну в общем да)))
                              • 0
                                Н если ebuild написать, то другие красноглазить не будут

                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.