Вместо вступления
Вопрос сборки Qt Embedded из Windows удивил меня своей глубиной. По части кросс-сборки под Windows CE и под ARM из Linux — информации в сети предостаточно. Но вот ARM из Windows — баста, требуется время для понимания.
Вся проблема в configure.exe, он совсем не такой как configure linux Embedded. Принимает усечённый набор параметров, и, соответсвенно, формирует мэйкфайлы, по которым qt никогда не соберётся.
Чем бороться с configure.exe
мы будем следующими способами:
1) добавлением в mkspecs qmake.conf дополнительных значений переменным qmake
2) установкой в \src\corelib\global\qconfig.h такого qconfig.h, который сформировался в образцовой Linix хост-машине
3) коррекцией сгенерированных Makefile-ов
4) коррекцией файлов проекта, если на комплект подключенных файлов не получилось повлиять из qmake.conf
5) Для моего toolchain мне пришлось изменять исходник qmutex_unix.cpp — там я закомментировал один хедер, он тянул с собой много чего, а на самом-то деле нужны были всего два дефайна. Попробуйте собрать без этого изменённого файла
И так начнём. Перечень инструментов
1) Windows 7
2) Пакет Qt Еmbedded qt-everywhere-opensource-src-4.8.5.tar.gz
3) Пакет Toolchain (у меня для pos-терминала, у Вас свой — например CodeSourcery)
4) Cygwin командная строка setup-x86_64.exе
5) Patch для qt-everywhere-opensource-src-4.8.5 под ваш Toolchain. Для компенсации некорректности работы configure.exe для кросс-платформенной сборки под ARM из Windows
6) Советую собрать qt на хост-машине Linux. У Вас появится эталоны Makefile, по которым Вы сможете отследить где какой исходник или хедер не подключился
Patch для qt
Это просто файлы для удобства копирования собранные в один каталог с системой подкаталогов пакета qt.
Вот пример Patch для qt:
qmake.conf содержит только это дополнение:
CONFIG += embedded
kbd-drivers = qvfb tty
mouse-drivers = qvfb linuxtp pc
gfx-drivers = qvfb linuxfb
decorations += default styled windows
Подготовка к сборке
1) Установить toolchain (у меня C:\Spire\SDT\TOOLCHAIN\20130326\bin )
2) Установить Cygwin
3) На диске С: создать директорию qt, скопировать туда qt-everywhere-opensource-src-4.8.5.tar.gz
4) Для информации – моя переменная среды Path:
%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Microsoft SQL Server\90\Tools\binn\;C:\Program Files\TortoiseSVN\bin;C:\Spire\SDT\MinGw\bin;C:\Program Files (x86)\Git\cmd;C:\Program Files\TortoiseGit\bin;C:\Spire\SDT\TOOLCHAIN\20130326\bin;C:\Spire\SDT\MinGW\msys\1.0\bin;C:\Qt\qt-everywhere-opensource-src-4.8.5\bin
5) Выполнить проверку доступности компилятора — под cygwin
ввести arm-unknown-linux-gnu-g++ -v
Вывод должен быть такой:
Using built-in specs.
Target: arm-unknown-linux-gnu
…Много текста…
Thread model: posix
gcc version 4.2.0
Сборка qt без поддержки glib
1)Распаковать qt-everywhere-opensource-src-4.8.5.tar.gz в текущую директорию c:\qt\qt-everywhere-opensource-src-4.8.5 и
установить патч. Для этого скопировать содержимое патча в c:\qt-everywhere-opensource-src-4.8.5
2) Выполнить проверку доступности компилятора — под cygwin
ввести arm-unknown-linux-gnu-g++ -v
Вывод должен быть такой:
Using built-in specs.
Target: arm-unknown-linux-gnu
…Много текста…
Thread model: posix
gcc version 4.2.0
3) Выполнить под cygwin вход в директорию qt:
cd /cygdrive/c/Qt/qt-everywhere-opensource-src-4.8.5
4) Скопировать в Cygwin конфиг, у меня он такой:
./configure.exe -release -embedded -arch arm -platform win32-g++ -xplatform arm-unknown-linux-gnu -fast -no-iconv -no-phonon -no-webkit -no-qt3support -nomake tools -nomake translations -nomake examples -nomake demos -no-3dnow -no-sse -no-sse2 -no-openssl -no-mmx -no-opengl -no-stl -no-nis -no-opengl -no-style-windows -no-style-windowsxp -no-style-windowsvista результат должен быть успешный:
mingw32-make[1]: Leaving directory `C:/Qt/qt-everywhere-opensource-src-4.8.5/tools/linguist/lrelease'
на запросы ответить:
сперва o
потом y
и ждать
Qt is now configured for building. To start the build run:mingw32-make.
To reconfigure, run 'mingw32-make confclean' and configure.
5) Изменить создавшийся файл \src\corelib\global\qconfig.h на корректный (который был сформирован в linux)
Для этого вновь установить патч
( скопировать содержимое патча в c:\qt-everywhere-opensource-src-4.8.5)
6) Запустить сборку, выполнить в Cygwin:
mingw32-make должна быть ошибка
/usr/bin/sh: line 0: cd: srctoolsbootstrap: No such file or directory
7) Исправить адреса в нотации Linux в главном Makefile
cd src\tools\bootstrap\ на cd src/tools/bootstrap/
cd src\tools\moc\ на cd src/tools/moc/
и т.д. до cd src\gui\ включительно
8) Запустить сборку, выполнить в Cygwin:
mingw32-make должны быть ошибки:
In file included from ../../include/QtGui/private/../../../src/gui/text/qfontengine_qpf_p.h:62,
from ../../include/QtGui/private/qfontengine_qpf_p.h:1,
from embedded\qwindowsystem_qws.cpp:83:
../../include/QtGui/private/../../../src/gui/text/qfontengine_ft_p.h:58:22: error: ft2build.h: No such file or directory
9) добавить в \src\gui\Makefile после строки DEFINES следующие строки:
DEFINES += -DQT_NO_FREETYPE
DEFINES += -DQT_FONTS_ARE_RESOURCES
Объяснение:
-DQT_FONTS_ARE_RESOURCES –для блокировки запроса пути к шрифтам из перем.окружения QT_QWS_FONTDIR. Она для Spire не устанавливается для окружения пользователя от имени которого запускается приложение.
Если не устанавливать DEFINES += -DQT_FONTS_ARE_RESOURCES, то будет сообщение в терминале Spire при запуске исполняемого файла:
QFontDatabase: Cannot find font directory C:\Qt\qt-everywhere-opensource-src-4.8.5/C:/Qt/qt-everywhere-opensource-src-4.8.5/lib/fonts — is Qt installed correctly?
10) Запустить сборку, выполнить в Cygwin:
mingw32-make.
Сборка выполняется успешно до библиотеки libQtGui.so включительно.
А что дальше
Для сборки других библиотек qt (которые идут после cd src\gui\ в коренном Makefile) нужно продолжить изменения адресов в нотацию Linux модулей по пункту 7.
Если при сборки возникнут ошибки — проверить исходный Makefile и образцовый из Linux хост-машины. Смотрите вывод ошибки, в каком именно файле проблема. Скорее всего файл не подключен. Почему не подключен? Для выяснения смотрите файл проекта *.pro.
Если при выполенния библиотеки проблема — выяснить что нужно изменить, скорее всего в этом случае, как в пункте 9 дополнительные константы в Makefile этой библиотеки.
Использовалась информация:
Developping for Qt 4.8 Embedded on Windows
Qt 4.8 Cross Compile for Embedded Linux using Linaro Toolchain from Windows
Установка Qt на встраиваемый Linux
Установка Qt Embedded
Файлы проекта qmake
Использование qmake
С пожеланиями всем разработчикам высоких творческих успехов, инженер-программист Владислав Хохряков.