Развертывание приложения QT под Windows NT с плагином MySQL


Пишу, чтобы не забыть. Да, меня впечатлила библиотека Qt, менеджеры компоновки божественны, сигналы-слоты это просто чудо, а QtCreator с его подстановкой кода, выравниванием, подсвечиванием - умиление. Все хорошо было, слишком хорошо. Проблемы были только на этапах установки и, самое печальное, развертывания кода

Первая проблема - я так и не смог ни разу собрать Qt из исходников. На официальном сайте лежали сырцы, к ним была приложена классная инструкция, но в них не хватало каких-то файлов, причем об этом узнавал я после минут сорока компиляции. Это откровенное свинство - не докладывать файлы, которые тянешь с официального сайта. После этого находил другие сырцы, в них те файлы были, но, как это ни печально, все равно не собрались они у меня ни разу. nmake падал непонятно из-за чего, в сети внятных ответов на эту проблему я не нашел, опустил руки и скачал бинарники с офсайта. Стыдно, винда плохо на меня действует видимо.

Вторя проблема - бинарная установка по умолчанию идет без плагинов. А мне был нужен плагин для работы с MySQL. Было бы все впорядке с сырцами - я бы указал перед компиляций, что мне нужно дополнительно собрать этот плагин, но что поделать. По крайней мере в бинарном установщике можно было указать, что мне нужны исходники всего Qt. В этих исходниках, конечно, были сырцы плагина MySQL. И вот, самое банальное - их же надо найти. У меня был Qt 4.8.1, сырцы плагина лежат в \QtSDK\QtSources\4.8.1\src\plugins\sqldrivers\mysql . Для того, чтобы их собрать, нужно скачать девелоперскую версию MySQL, т.е. в ней обязательно должны быть все инклуды и libmysql.lib. Положить всю эту папку лучше в корень диска, например, в С. Я положил ее в C:\MySQL. Далее, include директория: C:\MySQL\include, директория с либами - C:\MySQL\lib
Теперь можно собирать плагин MySQL я делал это по вот этой хорошей статье christopher.rasch-olsen.no/2009/04/14/qt-45-and...
там описывались решения проблем со сборкой при использовании MinGW, но у меня был компилятор от Microsoft, поэтому все получилось проще. Чтобы собрать плагин нужно открыть две консоли: одну консоль, которая идет от Visual Studio ( в ней будет запускаться nmake), вторую консоль, которая идет с QtCreator ( в ней будет запускаться Qmake). В каждый консоли нужно перейти в папку, где лежат сырцы плагина. В консоли, которая от Qt написать qmake "INCLUDEPATH+=C:\MySQL\include" "LIBS+=C:\MYSQL\MySQL Server\lib\opt\libmysql.lib" "CONFIG += debug release". Это подготовит make-файл плагина. После того, как все отработает, в консоли от Visual Studio надо написать nmake, это собственно начнет сборку исходников. Если все завершится успешно ( у меня обычно так и бывало, главное внимательно следить, чтобы при написании qmake пути к инклудам и либе были правильными), то в папках debug появится два нужных файл - qsqlmysqld4.dll и qsqlmysqld4.lib в папке release появятся такие же файлы, только без d на конце (первые - девелоперские, вторые для релиза). Дальше самое веселое. Из-за того, что плагин был собран руками, эти файлы никуда не перемещаются и их нужно переместить самому в нужные папки, чтобы Qt смогла их найти и слинковаться с ними при написании кода. Я так и не понял, куда точно надо положить эти файлы, поэтому кидал их везде, где только мог. В добавок к этим двум файлам нужно кидать еще два файла, которые идут от MySQL - libmysql.dll и libmysql.lib И так, я положил эти четыре файла в следующие папки: \QtSDK\Desktop\Qt\4.8.1\msvc2008\bin и \QtSDK\Desktop\Qt\4.8.1\msvc2008\lib и \QtSDK\Desktop\Qt\4.8.1\msvc2008\plugins\sqldrivers После этого для того, чтобы в программе можно было использовать эти библиотеки, в .pro файл проекта нужно добавить следующие строки CONFIG+=qt sql . После этого уже при соединении с базой указать нужный драйвер

Третья проблема - дебагер. В случае использования Visual Studio дебагер не идет по умолчанию. Странно, но даже если в ней пишешь программы и регулярно дебажишь их, нужно все равно скачать себе дебагер, например, отсюда msdn.microsoft.com/en-us/windows/hardware/gg463... (называется debugger tools for windows). Нужно запомнить папку, куда была произведена установка этого софта. После этого надо запустить QtCreator -> иструменты -> сборка и запуск -> инструментарии. Там надо найти все, что относится к MSVC, выбрать их, убедиться, что к ним не подключен дебагер (внизу окна поле отладчик). Если не подключен, то к каждому полю, относящемуся к MSVC нужно применить кнопку "Дублировать", а затем каждому появившемуся полю указать дебагер из папки, которые только что скачали (надо указывать файл cdb.exe) я это попытался показать в картинках





Но это еще не все. Нужно еще указать пути к символам. Для этого нужно не выходя из окна перейти на вкладку отладчик-> cdb и там указать произвольный путь к символам (например папку temp).



Теперь дебагер должен быть установлен. Нужно обязательно проверить это - написать простенькое приложение, поставить брейкпоинт и посмотреть, запуститься ли он. Если все хорошо, то при первом запуске он попросит указать пути к символам - можно указать ту же самую папку. К сожалению дебагер очень медленный, но лучше, чем ничего, что ни говори, но в борланде или Visual Studio намного удобнее и быстрее.


После всех этих весьма неприятных манипуляций я наконец-то смог начать писать код и наслаждаться Qt. До тех пор, пока не возникла последняя проблема

Четвертая проблема - развертывание. Это было самым большим ударом, потому что я привык своим неотягощенным мозгом думать, что это само собой разумющееся. В Visual Studio - слинковал статически и радуйся толстому экзешнику, который везде работает, просто галочку поставил. То же самое было в борланде. В Qt это было одной большой головной болью. Я начал с этой статьи doc.qt.digia.com/4.7/deployment-windows.html#st... . Естественно, хотелось все сделать просто и слинковать все статически, но вот незадача в том. что для этго нужно всю библиотеку Qt собрать из исходников с указанием того, что это надо сделать статически. А про мой опыт сборки исходников я уже написал. Поэтому пришлось делать с разделяемыми библиотеками. Для этого нужно в .pro файле проекта добавить строчку CONFIG += release, затем очистить в QtCreator проект, пересобрать полностью. После этого в папке release, где лежит проект, появится куча файлов с экзешником программы. Я эту папку скопировал в другое место, удалил из нее все, кроме экзешника и файла с его манифестом. В эту папку, где лежит экзешник, нужно положить библиотеки, от которых зависит программа. Это скорее всего будут библиотеки QtCore4.dll, QtGui.dll (обязательно, обязательно без d на конце, это очень важно) . Также я туда положил, на всякий случай, libmysql.dll Теперь очередь плагинов. Библиотеки нельзя просто положить рядом с экзешником. Надо cкопировать папку QtSDK\Desktop\Qt\4.8.1\msvc2008\plugins туда, где лежит экзешник. В этой папке обязательно должна быть библиотека qsqlmysql4.dll , которая была получена после сборки плагина. Обязательно надо удостовериться, что все библиотеки релизовской версии (без d на конце). Теперь наименее приятная часть. Рядом с экзешником нужно положить следующие библиотеки, специфичные для компилятора msvcp90.dll msvcr90.dll - они лежат в огромной папке C:\Windows\winsxs там среди тысяч папок надо найти ту, которая относится к используемой версии VisualStudio и обязательно это должны быть релизовские библиотеки. Чтобы не ошибиться, я поступал так. Скачал замечательную программу отсюда www.dependencywalker.com/ установил, запустил ее, открыл с ее помощью свой экзешник, нажал F9 и узнал точный путь, откуда берется библиотека. Попытался изобразить это на картинке (потом надо нажать F9 и программа покажет полный путь к библиотеке)



после этого на всякий случай я еще скопировал в папку с экзешником папки Microsoft.VC90.CRT и Microsoft.VC90.MFC они у меня лежали в C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86. Далее, чтобы уже совсем наверняка ничего не потерять, я положил в папку с экзешником Microsoft Visual C++ 2008 Redistributable Package (x86), которую взял отсюда www.microsoft.com/en-us/download/details.aspx?i.... Его надо развернуть на целевой машине в обязательном порядке. Конечно, нужно брать папки и файлы, соответствующие той версии студии, от которой зависит экзешник. Это не всегда наверное очевидно, поэтому можно с помощью любого хексового редактора, например WinHex, отккрыть бинарник экзешника и в нем сделать поиск по фразе "Visual" Там внимательно почитать что написано и найти упоминание о VisualStudio, обязательно будет указана используемая версия. Вот именно ее библиотеки и нужно будет пложить рядом с экзешником



Еще я положил на всякий случай библиотеки ieframe.dll и IEShims.dll потому что dependencyWalker показывал, что какой-то компонент зависит от них, но это был Warning, я сомневаюсь, что реально они нужны.
И вот после всех этих действий мне удалось добиться того, что у друга на машине все заработало. Заработало и у меня на чистой машине. Во вторник мне надо, чтобы это заработало на компе, куда мне надо это поставить и я надеюсь, что никогда в жизни не вернусь с этим людям.

Все эти трудности сильно подпортили впечатления от Qt, но я очень надеюсь, что когда-нибудь процесс развертывания станет у них таким же простым, как у Visual, я совсем отвык от такого красноглазия уже
Огромная благорадность вот этому человеку, без статьи которого я еще наверное долго бы бился головой о стену buffered.io/posts/resolving-side-by-side-config...

В довесок ко всему, еще одна проблема состоит в том, что по умолчанию QtCreator хранить файлы в кодировке ASCII - поэтому работать с кириллицей не стоит, пока это так. Лучше сразу перенастроить хранение файлов в кодировке UTF-8. Для этого надо зайти в Инструменты->Параметры->Текстовый Редактор->Поведение->Кодировака файлов = UTF8