Иногда кажется, что изучать что-то новое и потом это новое использовать в работе очень сложно. Но довольно часто новые, ранее незнакомые инструменты могут быть очень полезными.
Сегодня мы поговорим о том, как собрать библиотеку wxWidgets, а точнее ее порт wxWinCE, который используется для разработки приложений, работающих под управлением Windows Mobile и значительно упрощает процесс разработки GUI-приложений для карманных компьютеров и смартфонов под упралвением этой ОС. Для того чтобы собрать wxWinCE мы будем использовать Visual Studio 2008.
Итак, для начала нам необходимо загрузить исходный код wxWidgets с официального сайта. Сделать это можно здесь. На странице доступны различные версии дистрибутива wxWidgets, а также пакеты для различных ОС. На данный момент последней версией является 2.8.8. Лучше всего будет загрузить пакет wxALL (пакет, содержащий исходный код wxWidgets для всех поддерживаемых платформ и операционных систем).
После того как исходный код библиотеки загружен, распаковываем его и переходим в папку wxWidgets-2.8.8/build/wince. Здесь находятся файлы проектов для wxWinCE.

Открываем файл проекта wx_mono.vcp. При открытии Visual Studio предложит преобразовать файл проекта к новому формату.
Теперь, для того чтобы собрать библиотеку, нам необходимо сделать несколько подготовительных действий. Все дополнительные действия по настройке проекта необходимо проделать для каждой платформы, под которую будет собрана wxWidgets, потому что в противном случае собрать приложение с неправильно настроенной библиотекой будет невозможно.

В этом посте для примера будет использована платформа Pocket PC 2003 и Windows Mobile 6 Professional. Почему выбраны именно эти платформы? Pocket PC 2003 выбрана как самая старая. Приложения, собранные под эту платформу будут также работать под управлением более поздних версий Windows Mobile. Windows Mobile 6 Professional выбрана как самая новая.
Итак, открываем окно свойств проекта и переходим в раздел Configuration Properties -> General. В этом разделе в свойстве Output Directory устанавливаем значения:
- Для платформы Pocket PC 2003 – “..\..\lib\evc_armv4_lib”
- Для платформы Windows Mobile 6 Professional – “..\..\lib\evc_armv4t_lib”
Сделать это нужно для обеих конфигураций, Debug и Release.

Переходим в раздел Librarian -> General и в свойстве Output File устанавливаем значение $(OutDir)\$(ProjectName).lib для Release конфигурации и $(OutDir)\$(ProjectName)d.lib для Debug конфигурации.

Для платформы Windows Mobile 6 Professional переходим в раздел C/C++ -> Advanced и в свойстве Compile for Architecture устанавливаем значение ARM4T (QRarch4t).

Идем в раздел C/C++ -> Code Generation и в свойстве Enable C++ Exceptions устанавливаем значение No. Необходимо помнить, что сделать это нужно для обеих конфигураций и для обеих платформ.

Пытаемся собрать библиотеку, жмем Build. И что мы видим? Ошибки!!! Первое с чем прийдется столкнуться, это ошибка вида
—— Build started: Project: wx_mono, Configuration: Debug Pocket PC 2003 (ARMV4) ——
Creating ..\..\lib\evc_armv4_lib\winced\wx\msw\rcdefs.h
“clarm.exe” не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
Project : error PRJ0019: A tool returned an error code from “Creating ..\..\lib\evc_armv4_lib\winced\wx\msw\rcdefs.h”
Build log was saved at “file://e:\wxWidgets-2.8.8\build\wince\Pocket PC 2003 (ARMV4)\Debug\BuildLog.htm”
wx_mono – 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Лечится она просто, необходимо повторно запустить сборку проекта.
Смотрим дальше, ошибка вида
e:\wxWidgets-2.8.8\include\wx/aui/floatpane.h(33) : error C2504: ‘wxMiniFrame’ : base class undefined
..\..\src\aui\framemanager.cpp(2453) : error C2039: ‘SetTransparent’ : is not a member of ‘wxAuiFloatingFrame’
e:\wxWidgets-2.8.8\include\wx/aui/floatpane.h(32) : see declaration of ‘wxAuiFloatingFrame’
Лечится она тоже довольно просто, открываем файл floatpane.h и меняем декларацию макроса wxAuiFloatingFrameBaseClass
чтобы оно выглядел так:
#if defined( __WXMSW__ ) || defined( __WXMAC__ ) || defined( __WXGTK__ )
#include "wx/minifram.h"
#define wxAuiFloatingFrameBaseClass wxFrame
#else
#define wxAuiFloatingFrameBaseClass wxFrame
#endif
Следующее, ошибка вида
..\..\src\msw\window.cpp(5965) : error C3861: ‘VkKeyScan’: identifier not found
лечится добавлением функции-заглушки
unsigned int VkKeyScan(int)
{
return 0;
}
Хотелось бы отметить что в версии 2.8.7 библиотеки этой ошибки нет и если уж совсем не хочется что-то править в исходниках wxWidgets, то можно воспользоваться версией 2.8.7.
Ну вот, теперь можно собирать библиотеку. Собираем Debug и Release конфигурацию для обеих платформ.
Дальше, для удобства использования wxWinCE в проектах, нам необходимо добавить переменную окружения WXWIN и присвоить ей в качестве значения путь папке с исходным кодом wxWidgets.

Ну вот, со сборкой библиотеки мы закончили, теперь можно приступать к созданию нашего первого приложения, но об этом в следующий раз 😉