Visual C++ 2012, Qt и Windows XP

Я по большей части на MinGW всегда сидел, поскольку VC++ 2010 ну совсем уж чуть-чуть с C++11 (вернее, C++0x) дружил, в то время как у gcc с этим все было в порядке в гораздо большей степени. VC++ 2012 уже больше года как доступен, но Qt 5 под 2012 допилили только несколько месяцев назад. И вот решил я пощупать это дело поплотнее, с прицелом перейти на 2012 как основной тулчейн. Он для Windows роднее все же будет. Вон и 64bit есть.

Возвращение блудного сына в лоно святой Microsoft было поприветствовано капитальными глюками при построении проектов. Изменение .pro файла не приводит к вызову qmake и к переформированию Makefile, хотя, по виду, правила вроде правильно написаны. Пробовал разобраться, плюнул, написал затычку, которая после каждого построения удаляет Makefile. Далекое от элегантности решение, но иначе жить вообще невозможно. Потом отладчик показал себя как-то неуверенно. Точки прерывания работали, а вот пошаговое исполнение между вызовами функций регулярно приводило отладчик в ступор. Печально. Отладчик, знаете ли, иногда нужен. То, что это, вероятно, проблемы интеграции Qt с VC++ 2012, а не глюки имени сугубо Microsoft, меня нисколько не утешает. С MinGW таких проблем у меня не было.

А потом я попробовал запустить скомпилированную программу на XP. В том смысле попробовал, что она не запустилась: «я не Win32 приложение».

История вопроса

Вскрытие показало следующее. Microsoft в порыве свойственной ей мудрости решила напрячь свой монополистский мускул и убрала из Visual C++ 2012 поддержку Windows XP. Я так понимаю, это было сделано с целью «заставить» людей побыстрее уходить с Windows XP на семерку, спорное, неуклюже реализованное и вполне циничное действо, мол, прогнем разрабов. С технической точки зрения ничто не мешало сделать им один SDK, с которого бы компилировались программы под все версии Windows; в конце концов, они же не перестали поддерживать в Windows 8 запуск программ, скомпилированных для XP, так что в рантайме винды все есть. Но нет, для Windows 8 они нарисовали новый SDK, со старым не совместимый. Маркетинг по-балмеровски.

Однако, разрабы не захотели — почему? а, Балмер? — прогибаться. Видишь ли, Microsoft, как-то так нынче получается, что тебе очень даже можно найти замену, особенно если захотеть. Ну а с таким дешевеньким маркетингом а-ля «я самое толстое хамло на деревне» желание не заставляет себя долго ждать.

Видя такое дело, кто-то из власть придержащих в Майкрософт нащупал голову и решил поддержку XP запилить обратно. Но поскольку поезд давно ушел, сделать по-человечески и переписать Windows 8 SDK уже поздно, поддержка XP реализована тем, что Visual C++ 2012 обучили при компиляции использовать старый SDK. Получившееся безобразие задокументировано в MSDN.

Компиляция под XP в Visual C++ 2012 с помощью qmake

На основании инфы из MSDN и некоторого гугления сообразил я себе следующую фичу.

Visual Studio 2012 Express достаточно, только Update не забудьте поставить (я тестировался на Update 3). У меня также стоит Visual C++ 2010 Express; нужен ли — не проверял.

Проект скомпилировался, но на XP запускаться отказался: «The procedure entry point FlushProcessWriteBuffers could not be located in the dynamic link library Kernel32.dll». Как выяснилось, я забыл подложить новые msvcr110.dll и msvcp110.dll к exe, у меня лежали от необновленной студии. Как подложил новые — заработало. Qt я не компилировал.

Заработал у меня простой GUI проект с Widgets. Не могу дать гарантий, что нигде не стрельнет.

Итого

По результатам своих мытарств я пока не определился, какой тулчейн использовать как основной. Пока решил вернуться обратно на MinGW как минимум как на тулчейн, который буду использовать во время разработки, а то слишком много гемора. Хрень на баге сидит и корявостью погоняет. Добавьте ко всему вышеописанному тот факт, что многие C++ библиотеки под MinGW компилируются, а под MSVC даже не собираются планировать — и, может быть, ну его такие танцы. Кстати, забавное исключение: Thrift, писанный сугубо под юниксы, под MinGW у меня не собрался, а вот под MSVC получилось… Но я скорее допилю сборку Thrift под MinGW, чем буду корячиться в 2012 в его текущем виде. Может с qfs не будет таких проблем с билдом?

Цикл: qmake

Добавить комментарий