![image](https://habrastorage.org/getpro/habr/post_images/354/c3b/f71/354c3bf7179b263b23a8a371f76f79b8.jpg)
Нет никакой необходимости устанавливать 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 инсталляция кросс-компилятора проста:
В случае если не установлен пакет 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 связано как минимум три момента:
- Без zlib проект не соберется
- Без libiconv проект не соберется
- Есть баг связанный с поддержкой планшетников
Сборка и установка необходимых библиотек
Я не стал пользоваться утилитой 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/
Запускаем:
![](https://habrastorage.org/storage2/40c/3ba/323/40c3ba323f0a7481fabb0c4f7a3caa07.png)
Искренне надеюсь, что Вы видите тоже самое и данная статья для Вас интересна.
Поддержка libmysql
К сожалению, кросскомпиляция mysql-connector-c тянет на отдельную статью. Можно использовать заранее скомпилированные библиотеки и воспользоваться следующим руководством — www.qtcentre.org/wiki/index.php?title=Building_the_QMYSQL_plugin_on_Windows_using_MinGW.
Обращение к пользователям Gentoo от пользующегося Gentoo
Скорей всего в ближайшее время возьмусь за ebuild для qt-core, но пока не имею достачно сил и времени.