Сборка QtDBus под Windows
Компилятор
Сборка проводилась с использованием VS2005 (без SP1, т.к. SP1 пока содержит баг, который не позволяет нормально, т.е. без патчей, компилировать Qt). При использовании VS2003 так же возникают проблемы.
CMake
CMake - это утилита для создания make-файлов. Последнюю версию (2.4.6) бинарных файлов можно скачать отсюда. Инсталируем и позволяем программе добавить себя в PATH. Она нам пригодится при компилировании D-Bus под Windows.
win32libs
Содержит все библиотечные файлы, которые потребуются при сборке D-Bus под Windows. Скачиваем последюю версию отсюда (файл win32libs-20070112.zip).
Распаковываем всё в C:\win32libs. Устанавливаем переменные окружения для CMake:
CMAKE_INCLUDE_PATH=C:\win32libs\include
CMAKE_LIBRARY_PATH=C:\win32libs\lib
Добавляем в PATH:
C:\win32libs\bin
Qt 4.2.x
Коротко по сборке Qt 4.2.x:
- Если нет лицензии и коммерческой версии, скачиваем исходники Qt/Windows Open Source Edition версии 4.2.2 или более поздние (если есть).
- Распаковываем исходники в C:\Qt\4.2.2, например, и указываем переменные окружения:
QTDIR=C:\Qt\4.2.2
QMAKESPEC=win32-msvc2005
Добавляем в PATH
%QTDIR%\bin;%QTDIR%\lib - Для сборки коммерческой версии, никаких ухищрений производить не надо, просто из каталога %QTDIR% можно запустить configure.exe и затем nmake. Если переменные окружения не установлены для MSVS2005, то тогда делать это надо из Visual Studio 2005 Command Prompt. Для компиляции бесплатной версии можно воспользоваться советами из qtnode.net.
Считаем, что Qt уже установлена.
D-Bus для Windows
Идем в корень C:\ и с помощью svn, скачиваем последние исходники D-Bus:
cd c:\
svn co https://windbus.svn.sourceforge.net/svnroot/windbus/trunk windbus
Качаем *nix'овую утилиту под win32, которая потребуется для патча исходников, patch.exe и кладём её в любой каталог, который прописан в PATH. Теперь готовимся к сборку D-Bus:
cd c:\windbus\
patch.exe -p0 < DBus-win32.patch
После того, как я написал эту статью, я решил разобраться в исходниках, как происходит запуск сервиса D-bus (dbus-daemon.exe) из Qt-программ, т.к. было видно, что они неудачно пытаются запустить его, если он ещё не запущен, и обнаружил, что ошибка содержится в winDBus. Я сообщил об этом баге (2007-01-23 00:40). Если коротко, то проблема возникает из-за того, что в полном пути до файла dbus-daemon.exe содержатся пробелы (C:\Program Files\dbus\bin\dbus-daemon.exe).
Пока ошибку не исправили, делаем это сами. Открываем файл C:\windbus\dbus\dbus-sysdeps-win.c и меняем строчку 4875 на:
_snprintf(dbus_args, sizeof(dbus_args)-1, "\"%s\" %s", dbus_exe_path, " --session"); |
Изменения показаны красным цветом.
Потом, когда мы будем запускать наши программы, которые используют QtDBus, они автоматически будут запускать dbus-daemon.exe - консольное окошко, которое будет не только мозолить глаза, но иногда писать вcякие полезные отладочные сообщения. :) Для себя я решил спрятать это окошко от греха подальше, только раздражает (достать его я всегда смогу). Если кто-то хочет аналогичного, то нужно немного изменить код в соседних строках 4870-4879:
// Create process
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW;
ZeroMemory( &pi, sizeof(pi) );
_snprintf(dbus_args, sizeof(dbus_args)-1, "\"%s\" %s", dbus_exe_path, " --session");
// argv[i] = "--config-file=bus\\session.conf";
printf("create process %s %s\n", dbus_exe_path, dbus_args);
if(CreateProcessA(dbus_exe_path, dbus_args, NULL, NULL, FALSE, CREATE_NO_WINDOW, |
Всё, что изменил/добавил, я пометил опять же красным цветом. Кому лень возиться и вносить эти изменения, могут скачать dbus-sysdeps-win.c со всеми этими изменениями и заменить его у себя. Если я что-то напутал с этими исправлениями, сообщите пожалуйста об этом мне.
Продолжаем сборку:
cd c:\
mkdir windbus-build
cd windbus-build
cmake -G"Visual Studio 8 2005" ..\windbus\cmake\
В каталоге c:\windbus-build появится файл проекта dbus.sln. Собираем и инсталируем из IDE Debug и Release версии. То же самое можно сделать из командной строки (всё будет собираться в фоновом режиме):
devenv /build Debug /project INSTALL dbus.sln
devenv /build Release /project INSTALL dbus.sln
После этого в C:\Program Files появится каталог dbus, в котором будут все необходимые бинарники, файлы библиотек и заголовочные файлы.
Устанавливаем переменные окружения:
DBUS_INSTALL_DIR=C:\Program Files\dbus
DBUSDIR=C:\Program Files\dbus
Добавляем в PATH:
%DBUS_INSTALL_DIR%\bin
Добавляем в INCLUDE:
%DBUS_INSTALL_DIR%\include
Добавляем в LIB:
%DBUS_INSTALL_DIR%\lib
Бинарные файлы из %DBUS_INSTALL_DIR%\bin, используют dll из C:\win32libs\bin, именно поэтому ранее мы добавили этот каталог в PATH.
Убеждаемся, что в %DBUS_INSTALL_DIR%\lib есть файл dbus-1.lib и dbus-1d.lib.
QtDBus
Теперь настала пора собрать QtDBus под Windows:
cd %QTDIR%
patch -p0 < c:\windbus\QtDBus-win32.patch
cd tools\qdbus
qmake -recursive
nmake
nmake install
Итак, QtDBus собрана... В %QTDIR%\bin можно увидеть новые файлы:
qdbuscpp2xml.exe
qdbusxml2cpp.exe
qdbus.exe
QtDBus4.dll
QtDBusd4.dll
Теперь, можно перейти в файлы примеров и собрать их:
cd %QTDIR%\examples\qdbus
qmake qdbus.pro
nmake
Для запуска примеров никакого сервиса dbus-daemon.exe запускать самому не надо, это сделают сами программы, которые используют QtDBus, если обнаружат, что он не запущен. В списке процессов при запуске должен появится dbus-daemon.exe. Если вы не прятали окно этого процесса, в отличие от меня, то его даже не надо будет искать в списке, т.к. на экране появится консольное окно.
Ну а теперь можно приступать к играм.. :)
