вторник, 24 сентября 2013 г.

Qt 5.1 (5.1.1), статическая линковка (статическая компоновка), Windows 7, MinGW 4.8

Qt дорос до версии 5, повзрослел. Отныне для Windows не требуется прописывать переменные окружения и пути. Каждая сборка не зависит ни от чего, система ничего "не знает" ни об одной из них. Это здорово, поскольку теперь программисту не нужно думать о том, где его Qt "наследил".
Что же касается самих сборок, с ними не всё так гладко, как хотелось бы. В идеале я должен, например, с помощью configure указать, куда положить новую сборку (mingw48_32), а при выполнении mingw-make все собранные файлы должны оказаться там, куда я указал, а не вперемешку с сырцами. Увы, пока мечты. Мечтой пока что остаётся получить копию установленной заранее папки mingw48_32 (с Assistant`ом, Designer`ом и тд). После сборки из сырцов с параметрами по умолчанию таких файлов нет.

Итак, собираем Qt 5.1 (5.1.1)

1. Прежде всего устанавливаем Perl и Python (в папки по умолчанию), проверяем, что Perl прописался в Path, туда же прописываем путь к Python (C:\Python27).

2. Устанавливаем Qt :). Я выбрал Online инсталляцию. Не забываем Mingw 4.8


3. (не обязательно) Если вы не сторонник мусора в Src, установите Git в виде Git Extensions, создайте репозиторий в папке D:\Qt\5.1.1\Src. Так гораздо удобнее чистить папку Src от мусора, который появляется в процессе конфигурации/сборки + отпадает необходимость выполнять confclean. Можно пропустить этот шаг.




4. Копируем папку mingw48_32. Здесь будет лежать новая сборка со всеми файлами, которые есть в оригинальной сборке, но не собираются из сырцов. Если считаете этот шаг ненужным, просто создайте новую папку, куда вы скопируете содержимое qtbase после окончания сборки. 




5. Редактируем  D:\Qt\5.1.1\Src\qtbase\mkspecs\win32-g++\qmake.conf, находим QMAKE_LFLAGS,  заменяем на QMAKE_LFLAGS = -static -static-libgcc

6. Создаём батник (в силу ленивости) в D:\Qt\5.1.1\Src\qtbase  (static_gpp.bat) следующего содержания:


SET "QTDIR=%~dp0"
SET "QTDIR=%QTDIR:~0,-1%"
SET QMAKESPEC=win32-g++
SET "PATH=D:\Qt\Tools\mingw48_32\bin;%QTDIR%\bin;%PATH%"
pause

configure.exe -debug-and-release -opensource -static -opengl desktop -no-vcproj -nomake examples || @goto :ends

pause

mingw32-make

:ends
@cmd /q /a /k ""

Паузы и прочие излишества разумеется можно добавить по своему усмотрению. Также хотелось бы обратить внимание на обязательное наличие -nomake examples,  иначе сборка займёт неприлично долгое время и съест примерно 50 ГБ свободного пространства. Оно вам надо?
Можно положить его в репозиторий, чтоб потом 2 раза не бегать :)

7. Запускаем батник, ждём, пока всё соберётся.

8. Копируем содержимое D:\Qt\5.1.1\Src\qtbase в папку, созданную в пункте 4. Можно копировать не всё. Файлы, лежащие в корне этой папки, а также папки .obj, config.tests, dist, qmake, src, tests, util нам не нужны

Теперь необходимо прописать новую конфигурацию в Qt Creator. Запускаем его.

9. Tools/Options/Build&Run/Qt Versions. Добавляем новую версию, указываем путь к qmake, который лежит в нашей новой папке слэш bin.




10. Tools/Options/Build&Run/Kits. Добавляем новый, указываем версию Qt, созданную ранее.





Всё готово. Теперь создаём GUI проект, выбираем новую конфигурацию, компилируем. Если размер полученного приложения внушителен (больше 1 МБ), значит, всё получилось. Но на всякий случай проверяем, запустив его.

7 комментариев:

newcheb комментирует...

Спасибо тебе громадное!!! Я уж думал все qt библиотеки перебирать.

scorpak47 комментирует...

Громаднейшее СПАСИБО тебе, после недели мучений именно твоя статья помогла все наладить и не вдаваться в шаманские мучения.))))))

Анонимный комментирует...

Сделал все как ты говорил, не хочет компилировать - говорит не знаю, что такое QApplication... Что делать?

Анонимный комментирует...

Это исчезло, выставил правильный компилятор. Теперь не может найти qwt, что ж такое.

Erte комментирует...

Честно говоря, я тут ничем не могу помочь. Я экспериментировал несколько дней (особенно порадовала бесконечная пересборка всех примеров на Intel E7200).
Я просто просуммировал тот опыт, чтоб не забыть в нужный момент, потому как Qt использую крайне редко. В своё время несколько раз долбался с одними и теми же вещами в Qt 4.4 - 4.6, надоели эти грабли :)

Анонимный комментирует...

какой ставить Python? 3.4.1 или 2.7.8

какой ставить Perl? ActivePerl StrawberryPerl или DWIMPerl

Анонимный комментирует...

Python 2.7 и ActivePerl работают.