Pull to refresh

Сборка Qt5 в Visual Studio 2012 или я могу пришить глаз кенгуру пока течет мой любимый кетчуп

Reading time 7 min
Views 38K
Не так давно вышел новый Qt, обещающий большое и светлое будущее, и я решил опробовать сие чудо. Но для начала работы с этим чудом мне понадобилось собрать его для моей установленной студии 2012 года из исходных файлов. А сборка оказалась далеко не тривиальной (хотя кривость моих рук никто не отменял – таким студентам, как я, руки необходимо об забор выпрямлять).

Как только вышла в конце прошлого года стабильная версия нового Qt5, я решил было его скачать и попробовать, но, к сожалению, те сборки, которые мне были нужны, а именно: для платформы Windows сборки под MinGW и Visual Studio 2012, — отсутствовали на сайте qt-project.org. Поэтому я скачал и установил готовую сборку для моего линукса: Ubuntu 12.04. Правда мной уже тогда были предприняты попытки (правильнее потуги) собрать хотя бы для MinGW библиотеку из sources. Однако все обернулось неудачей, расстройством и глубокой депрессией.

В конце января разработчики порадовали нас версией 5.0.1, исправленной и собранной для работы с MinGW 4.7. Однако для VS2012 они снова не выложили сборку. И тут я решил, стоит попробовать снова, а вдруг получится?

В поисках информации по интернету я наткнулся на несколько статей по сборке, но никак не под VS2012. Самой правдивой, на мой взгляд, оказалась версия на официальной вики страничке проекта, как бы странно это не звучало. Поэтому попробую описать весь этот процесс еще раз здесь, попутно комментируя и добавляя свои, нужные, на мой взгляд, пункты по сборке. Решил рискнуть и собрать как можно более полную библиотеку.

Что необходимо:

  • Установленная Visual Studio 2012 (не Express Edition). Windows Development Kit 8 с DirectX должен быть уже в комплекте
  • Установленный ActivePerl
  • Установленный Python 2.7
  • Установленный Ruby
  • Установленный ICU. Примечание, сайт не официальный
  • А также скачать собственно сами исходные файлы


Замечание, по какой-то, неизвестной мне причине, python версии 3.3.0 выдавал ошибку при трансляции файлов, хотя разработчиками заявлена работоспособность нового питона, поэтому пришлось ставить версию 2.7.

Мои действия даже мне до сих пор кажутся сильно шаманскими, поэтому я постараюсь подробно описать свои неумелые шаги, так как пересобрать заново всю эту махину мне не то чтобы не охота – время и нервы жалко. Надеюсь, что кто-то возьмется тоже собрать, и расскажет, что не получилось из моего метода, и совместными знаниями «добьем», так сказать, сие чудо. Рекомендую вначале ознакомиться со всей статьей во избежание мелких недоразумений во время сборки.

Итак, начнем.

Моя система – Windows 8 Pro with Media Center x64. Ноутбук марки eMachines E732ZG. Краткие характеристики: Intel Pentium P6200 (двухъядерный) 2.13 GHz на каждом ядре, 6 GB RAM DDR3, 320 GB HDD. Версия Visual Studio 2012 Ultimate Update 1. Kaspersky Internet Security 2013 был выключен на время сборки.

Все дополнительные программы я установил в C:\Development\. ICU был скачан не на официальном сайте, а на другом, но там была выложена сборка для vs2012.

В эту же папку были распакованы исходные файлы Qt5.0.1:

C:\Development\qt-everywhere-opensource-src-5.0.1

При установке были выбраны галочки для прописи perl, ruby и python в переменную окружения PATH. Думаю, что вариант их ручной прописи в командной строке, в которой мы будем собирать, тоже сгодится:

set PATH=C:\Development\Perl64\bin;C:\Development\Python27;C:\Development\Ruby193\bin;%PATH%


Запускаем Command Prompt VS 2012 (я запускал от имени Администратора). Эта штука прописывает все свои либы в пути, поэтому запускаем именно ее. Сам батник находится в
«C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\VsDevCmd.bat».
Затем в ней задаем следующие переменные:

set CL=/MP
set INCLUDE=C:\Development\icu-50.1.2-shared-vs2012\include;%INCLUDE%
set LIB=C:\Development\icu-50.1.2-shared-vs2012\lib;%LIB%
set PATH=C:\Development\icu-50.1.2-shared-vs2012\bin;%PATH%


Командой set CL=/MP мы указываем, скорее всего, утилите nmake что у нас несколько ядер: «Поэтому, пожалуйста, распараллеливайте задачи по компиляции».

Далее переходим в саму папку с sources:

cd C:\Development\qt-everywhere-opensource-src-5.0.1

Следующие действия, я думаю, сделать сразу, так как иначе сборка qtwebkit проходит с ошибкой, точнее не проходит:

set PATH=%PATH%;%CD%\gnuwin32\bin
cd .\qtwebkit
set WEBKITOUTPUTDIR=%CD%\WebkitBuild
cd ..\


Кстати, команда set WEBKITOUTPUTDIR=%CD%\WebkitBuild под большим вопросом, нужна ли она здесь? Она была взята из мануала по отдельной компиляции qtwebkit.

Можете убедиться в правильности всех путей набрав следующее:

set INCLUDE && set LIB && set PATH


Кстати еще, можете сделать батник из этих команд и запускать его посредством той же Command Prompt 2012.

Конфигурация

Теперь нужно откофигурировать сборку. Для этого набираем следующее, находясь в директории C:\Development\qt-everywhere-opensource-src-5.0.1\:

configure -prefix C:\Development\Qt\5.0.1_MSVC2012\qtbase -opensource -platform win32-msvc2012 -debug-and-release -shared -c++11 -nomake examples -nomake tests -icu -confirm-license


  • Параметром -prefix C:\Development\Qt\5.0.1_MSVC2012\qtbase мы задаем место инсталяции нашего Qt.
  • -confirm-license просто пропускает запрос о согласии с лицензией.
  • -platform win32-msvc2012 указываем ручками платформу. Мне кажется, что она может быть определена автоматически.
  • -debug-and-release собирает сразу два варианта, как для отладки так и без нее. Еще варианты: -debug или -release.
  • -c++11. Странно, но почему-то этот параметр игнорируется, хотя в VS2012 заявлен новый стандарт. Кстати, при попытке собрать для MinGW 4.7 также игнорировался. Интересно, как обстоит дело на Linux для gcc?
  • -nomake examples -nomake tests не собирают для нас пример и тесты – лишнее место, но если хотите, можете не указывать
  • -shared. Этот параметр определяет будущее ваших будущих приложений на Qt (не знаю как сказать по-другому). Если он указан (хотя, по-моему, определен по умолчанию) то все собранные приложения будут зависеть от наличия установленных библиотек на машине. То есть с переносом даже на соседский компьютер будет беда. Для сборки независимых приложений следует указывать -static. Но будущие приложения существенно вырастут в размере (10 кб против 10 мб в простой программе helloworld с GUI).


Остальные параметры конфигурации можно узнать, набрав:

configure -help


Здесь либо будут ошибки, которые еще просто исправить (каких-то путей не хватает или библиотек), либо все соберется хорошо. Процесс занимает не более 10 минут.

Компиляция и установка

Далее все менее радостно. Просто запускаем команду nmake и курим, пьем чай, готовим, спим и т.д. После многочасовой сборки (или многосуточной) можно запускать команду nmake install. Она скопирует вашу библиотеку в указанную директорию в параметре -prefix.

Опыт

У меня все было еще печальнее. Изначально в PATH стоял питон версии 3.3, а вот эту штуку я не делал:
set PATH=%PATH%;%CD%\gnuwin32\bin

Я не знаю, сколько длилась сборка, час, два или больше, но при попытке собрать qtwebkit утилита nmake вывалилась из-за отсутствия какого-то win_flex. Я психанул, так как это была моя уже третья попытка собрать всю библиотеку с qtwebkit, и просто ввел nmake install. Библиотека была скопирована, но не до конца. Опять же вывалилась при попытке скопировать не скомпилированный qtwebkit.

На мою студию к этому моменту уже было установлено расширение Visual Studio Add-in 1.2.0 for Qt5. В настройках я указал путь к установленной на половину библиотеке. Создал первое пробное приложение, но после удачной сборки но отказалось запускаться из-за отсутствия трех .dll от icu. Пришлось дописывать в PATH путь C:\Development\icu-50.1.2-shared-vs2012\lib и перезапускать студию, в итоге в студии все запускается без проблем. QtCreator после до настройки на эту библиотеку отказался нормально запускать удачно собранные приложения. Они почему-то вылетали с ошибкой. Запустив собранное приложение из директории сборки, оказалось отсутствует D3DCOMPILER_46.dll Не знаю, что с этим делать. Буду рад, если подскажете.

Затем я начал искать способы собрать этот печальный модуль, и наткнулся на такую инструкцию:

set PATH=%PATH%;%CD%\gnuwin32\bin
cd .\qtwebkit
set WEBKITOUTPUTDIR=%CD%\WebkitBuild 
perl Tools\Scripts\build-webkit --qt --qmake=”%CD%\\..\\qtbase\\bin\\qmake.exe” --install-libs= (install der) --release --makeargs=%MAKEFLAGS%


Но nmake теперь сругался на MAKEFLAGS. Запустил без этого аргумента:

perl Tools\Scripts\build-webkit --qt --qmake=”%CD%\\..\\qtbase\\bin\\qmake.exe” --install-libs= (install der) --release


Однако теперь nmake стал ругаться на отсутствие MainThreadQt.moc. Поэтому я ввел nmake clean и вышел в общую папку qt. Уже оттуда я запустил nmake (теперь в path дописан %CD%\gnuwin32\bin), и, о чудо, оно работает, ОНО СОБИРАЕТСЯ. Причем с того момента, где вывалился (он проверил, что собранные либы уже существуют и дошел до первой несобранной). Правда через некоторое время он вывалился снова. Теперь меня подвел питон версии 3.3. Где-то в интернете я прочитал, что стоит поставить версию 2.7, что я и сделал. Перезапустил командную строку после установки и замены в переменной PATH пути до питона. Заново прописал все set и ввел nmake. Он продолжил свою работу.

Теперь сижу жду уже битый час окончания всей эпопеи. Последнее действие началось в около 14:00 МСК, где-то в 22:35 он закончил собирать qtwebkit\webcore версию debug_shared и начал «стряпать» release объектники, что займет тоже самое время. Плюсом, там, судя по-всему, была собрана еще не вся библиотека. Надеюсь, что за предстоящую ночь все сделается.

На момент написания основной части статьи, nmake собирал qtwebkit уже часов 8 к ряду. Сейчас прошло уже более суток с момента последнего запуска nmake. Спешу обрадовать (воспринимать двояко) – за сутки и 6 часов он собрал qtwebkit, еще 2 – 4 часа было потрачено в самом начале на сборку основной библиотеки. Еще 2 — 3 часа ушло на досборку утилит, таких как QtDesigner, Linguist и Assistant. Сборка завершилась удачно, без сбоев. Папка с исходными файлами выросла с 700 – 800 Мб, до 10 Гб!

Затем запустил nmake install. Копировал минут сорок. В итоге папка C:\Development\Qt\5.0.1_MSVC2012\ весит 1.22 Гб. Через Visual Studio Add-in 1.2.0 for Qt5 к VS2012 все «цепляется» замечательно, только одна проблема, все скомпилированные Qt приложения, даже QtDesigner требуют какой-то D3DCOMPILER_46.dll. Его я нашел по адресу C:\Program Files (x86)\Windows Kits\8.0\Redist\D3D\x86\. А также еще требовались библиотеки icudt50.dll, icuin50.dll, icuuc50.dll, которые находятся в C:\Development\icu-50.1.2-shared-vs2012\lib.

По какой-то непонятной мне причине designer и assistant из этой сборки не запускаются, даже после ручного добавления к ним D3DCOMPILER_46.dll. Кто-то может что-то по этому поводу что-нибудь дельного сказать?

P.S. Надеюсь, что вам данная статья поможет, и вы потратите меньше времени на выяснение причин неработоспособности.
Tags:
Hubs:
+41
Comments 36
Comments Comments 36

Articles