Благодаря стараниям Станислава Блинова у нас появилась возможность разрабатывать ПО для Windows Mobile в Linux, используя компилятор cegcc и библиотеку wxWidgets. О том как настроить средства разработки для Windows Mobile под Linux рассказано в ниже следующей статье:

Захотелось мне тут выяснить, насколько “умерла” бесплатная разработка софта под WinCE. Великий Гугель вывел меня на штуку под названием cegcc – кросс-компилятор, позволяющий собирать WinCE приложения под Линуксом. После возвращения из осадка, в который я выпал, узрев данный инструмент, я решил его проверить на практике.

Проверка прошла успешно – приложения действительно собираются и работают. Правда, местами приходится кое-что править… И тогда захотелось экзотики, а именно – собрать с помощью cegcc библиотеку wxWinCE – порт wxWidgets для WinCE. Сделать это оказалось, мягко говоря, непросто, но все же реально.

В процессе поиска информации по данному вопросу я наткнулся на вот этот пост: http://article.gmane.org/gmane.comp.gnu.cegcc.devel/827. Erik van Pienbroek подкинул отличную шпаргалку. Его патчи действительно встали на ревизию 49149 и после небольшой доработки напильником она собралась. Правда, работала она, мягко говоря, плохо. Рисовала окна как попало, меню размещала вверху окна, само окно, кстати, зачем-то ополовинивала, ну и т.д. Но это уже было что-то.
Потом я умудрился адаптировать (напильник был большой) эти патчи к релизу 2.8.9, т.е. так же собрать сам релиз и получить такую же библиотеку с весьма странным поведеением. И уже только потом стал разбираться, что же не так. Оказалось все достаточно просто – всего лишь правильно указать версию и тип системы… Ну да хватит, как говорится, от слов – к делу!

Далее я опишу способ, как собрать wxWinCE-2.8.9 для PocketPC. Для начала определимся с исходными данными. Система, на которой все это производилось – Debian Lenny:

Linux 2.6.26-1-686 #1 SMP Thu Oct 9 15:18:09 UTC 2008 i686 GNU/Linux

Перечень вещей, которые понадобятся:

  • bison, yacc
  • mingw32ce
  • Bakefile
  • wxWidgets-2.8.9
  • Патч для wxWidgets
  • Файл autogen.mk

Итак, приступим…
Марлезонский балет, часть первая. Установка mingw32-ce.

В принципе, данный процесс достаточно хорошо документирован здесь. Но раз уж мы за это беремся, несколько слов скажу.

  • Если у вас вдруг нету, поставьте bison и yacc (для Debian ставятся через apt-get).
  • Нужно взять с svn текущую версию cegcc:
$ svn co https://cegcc.svn.sourceforge.net/svnroot/cegcc/trunk/cegcc cegcc

Когда скачается, в текущей директории появится директория cegcc.

$ cd cegcc/src
$ mkdir build-mingw32ce

Собирать в корне исходников скрипт не даст, сам попросит создать директорию.

$ cd build-mingw32ce
$ sh ../build-mingw32ce.sh

Все, пошла сборка (и установка). По умолчанию компилятор встанет в /opt/mingw32ce. Этот путь можно поменять с помощью опции --prefix к скрипту (например ../build-mingw32ce.sh --prefix=/my/super/puper/dir/mgwce)

После установки компилятора добавьте /opt/mingw32ce/bin (соответственно, если вы не меняли префикс) в PATH. На Debian это можно сделать в /etc/profile.

С компилятором все, переходим ко второй части балета.

Сборка wxWinCE

  1. Нам понадобится Bakefile. Если его нет (или если он древнее, чем 2.3.0) – взять можно на www.bakefile.org. Эта утилита будет новые Makefile’ы создавать.
  2. Теперь надо скачать архив wxWidgets-2.8.9 и куда-нибудь его распаковать. Все остальные действия надо производить, находясь в директории wxWidgets-2.8.9. (Здесь и далее на скриншотах зеленым выделены моменты, на которые стоит обратить внимание).
  3. tar xzf wxWidgets-2.8.9.tar.gz
  4. Прилагаемый файл autogen.mk помещается в директорию build. Затем можно применить патч.
  5. cp /home/capricorn/work/articles/mingw32ce-wxWinCE/autogen.mk build
    patch -p0 /home/capricorn/work/articles/mingw32ce-wxWinCE/wxWinCE.patch-2
    
  6. Немного поправим WinCE SDK, а именно – файл /opt/mingw32ce/arm-mingw32ce/include/aygshell.h. Нужно добавить в него следующие строки:
    #define COMCTL32_VERSION 0x020e
    #define SHA_INPUTDIALOG  0x00000001
    #define GN_CONTEXTMENU   1000
    #define SHRG_RETURNCMD   0x00000001
    

    Эти определения присутствуют в “родном” aygshell.h из Windows Mobile 5.0 SDK. При желании можете посмотреть, где точно они располагаются в этом файле, и добавить их в те же места.

  7. Этот шаг необходимо выполнить, если Bakefile у вас не 2.3.0 (здесь я отметил файлы, которые должны быть заменены). Путь /usr/local/share/aclocal, естественно, действителен для Debian. На другой системе может быть другим.

    cp /usr/local/share/aclocal/bakefile* build/aclocal
    
  8. Теперь нужно создать новые билд-скрипты

    ./autogen.sh && make -f build/autogen.mk
    

    Процесс займет некоторое время, в результате должно получиться примерно следующее:

  9. Выполнение этого шага сконфигурирует среду на сборку статической монолитной библиотеки с поддержкой юникода. Опция --prefix нужна, чтобы указать, куда впоследствии будет инсталлироваться wxWinCE. Поскольку mingw32ce у меня лег в /opt, wxWinCE я решил положить рядышком, так что я выбрал --prefix=/opt/wxWinCE-2.8.9:

    По завершении конфигурации вы должны получить такую картину:
  10. Теперь остается только выполнить $ make И можно смело идти пить кофе. Когда же, наконец-таки, все будет собрано, останется только проинсталлировать:
    $ sudo make install
    

    Последний шаг нужно выполнять от имени root’а (если только вы не поставили в --prefix директорию, в которую вам разрешена запись). Так что – либо sudo, либо su.

    Вот и все. Теперь можно смело собирать сэмплы или свои собственные приложения. Для получения флагов компилятора не забывайте использовать <prefix>/bin/wx-config. Примерно таким же образом можно собрать и динамическую, и debug библиотеку (см. configure --help). Вот только чтобы собрать wxWinCE для смартфона надо руками править configure. К сожалению, я не спец по autotools. То, что было необходимо подправить – догадался, откопал, подсмотрел… А по-хорошему надо бы дописать строчки в configure.in, чтобы после autogen скрипт configure позволял бы с помощью опций указать версию WinMobile и тип платформы. Но это уже будет, видимо, другая история…

Previous ArticleNext Article
Технический директор IT-Dimension, компании-разработчика кросс-платформенного программного обеспечения

This post has 23 Comments

23
  1. Обалдеть, работа проделана большая, автор молодец. Надо будет на досуге попробовать 🙂

    Так держать 😉

  2. Угу, уже самому нетерпится попробовать… может на выходных. Но идея сама по себе очень неплохая. Если еще разобраться с отладкой приложений для Windows Mobile под Linux, то будет вобще супер.

  3. Девелопер на трекере-таки попросил все это дело на svn сконвертить. Эх… придется попотеть 🙂

  4. Эээ.. не понял хода мысли..
    Ты делаешь патч для официальной версии wx?

  5. Ну а почему бы и да?
    Вообще я просто отправил все как есть в ветку патчей для 2.8.9, но там господин был сильно “afraid of applying it to stable version” и спросил, могу ли я это на svn применить.

    В конце концов, если однажды можно будет скачать wxWidgets-*.tar.gz и собрать wxWinCE с помощью mingw32ce без всяких патчей, я буду только рад, и думается мне, что не только я 😉

  6. Ну вот, svn-патчу поставили статус ‘new’. Обещают на этой/следующей неделе вынести вердикт, первоначальная оценка положительная. Кстати, немного подразобрался с autotools’ами, так что сегодня/завтра сделаю еще одну, “правильную” редакицю патча для 2.8.9

  7. Ждем-с… 🙂 Об видео не думал? Что-то у меня со временем не складывается, но если надумаешь сделать скринкаст, я могу подредактировать/порезать/сконвертить в нормальный формат для загрузки 🙂

  8. Можно… Коли не забуду, поставлю на запись, когда закончу патч твикать и буду делать тестовый билд

  9. Ухх, долгий получился перерыв, однако вернулся я все-таки к данной теме.

    Касательно официального патча – с ним есть некоторые проблемы, обусловленные, эмм, не совсем корректными заголовочными файлами от mingw32ce. Разработчики данного чуда обещали поправить, после чего видимо г-н Zeitlin рассмотрит применение патча на svn.

    А видео жди завтра, сейчас как раз патч для 2.8.9 ломаю 🙂

  10. Добрый день.
    Столкнулся с несколькими проблемами при использовании описаной выше сборки.
    1. wx-config про(тестовый аппарат RoverPC W5 wm5.0).сит в параметры компилятора добавить -mthreads но с таким флагом собраные приложения не хотят запускаться под wince
    2. Меню (сделаные как в соседней статьй про простейшее приложение) не работаю… точнее их вообще нет…. нижняя часть окна (там где кнопка вызова клавиатуры и меню) просто прозрачная и сквозь нее видно фоновое приложение…

    Остальное в целом работает…. хотя я слишком глубоко не капал…

    Спасибо за статью, надеюсь решение моих проблем найдется.

  11. Это скорее к radcapricorn’у вопрос.
    Навскидку можно так подумать что:

    • В Windows отдельный SDK для Windows Mobile и Windows CE, может есть какая-то разница в библиотеках. То что может под WM работать, теоретически может не работать под WinCE
    • Вы собрали wxWidgets и приложение не под ту архитектуру процессора. Если для ARM сборка под более ранние версии канает, то под XScale непример оно не заработает. Вы уверены что у вас правильная архитектура указана?
    • Как ведут себя приложения, собранные с wxWidgets под Windows на вашем устройстве? Они работают нормально?
    • По поводу меню, вы .rc файл добавляли в проект? Без файла ресурсов с меню будут очень большие проблемы. надо чтобы wx/msw/wx.rc был обязательно в проекте
  12. Архитиктуру для сборки приложения испотзую такуюже как для сборки wx указаную в статье (arm-mingw32ce). На девайсе процессор i.MX21 (самый неизвестный в мире =)) но архитиктура у него армовская…

    Файл ресурсов дал только икконку приложения, на меню ни как не повлеял =(

  13. Хм.. ладно. А все же попробуйте пересобрать под Windows ваше приложение. Я помню у меня была определенная разница в поведении в VC++ и MinGW версии десктопного приложения. Может и для мобильных есть разница.
    Если собранная под Win версия будет работать как надо, тогда можно будет еще подумать.

  14. не имею возможности =(
    если у вас есть простейшее приложение собраное под vc++ не могли бы вы его выложить? (бинарник + исходник) тогда я соберу его под cegcc и сравню работу моей сборки и вашей на своем кпк…

  15. HabraSnake собралась но пока не отключил mthread незапускалась…

    Меню тоже нету – но все остальное работает нормально…

    Видимо дело в сдк в комплекте с cegcc =(

  16. Тема заглохла? =(

    хотелось бы всетаки допилить… но я даже не знаю куда копать =(

  17. аааааа зверюга! даже и представить себе не мог, что можно под линуксом wxWidgets для winMobile собрать.

  18. Hello, I tried this with a certain degree of success. However after building wxWidgets I tried to build the demos and got

    $ make
    /home/user/Downloads/wxWidgets-2.8.9/wincewppcstatic/bk-deps arm-mingw32ce-g++ -c -o bombs_bombs.o -D__WXWINCE__     -I../../../demos/bombs  -I../../../demos/bombs/../../samples -D__WXWINCE__ -D__POCKETPC__ -I/home/user/Downloads/wxWidgets-2.8.9/wincewppcstatic/lib/wx/include/arm-mingw32ce-wince-unicode-release-static-2.8 -I../../../include -D__WXWINCE__ -D_WIN32_WCE=0x420 -D_WIN32_IE=0x400 -D__POCKETPC__ -DWX_PRECOMP -mthreads -fno-rtti -Wall -Wundef -Wno-ctor-dtor-privacy -O2 -fno-strict-aliasing ../../../demos/bombs/bombs.cpp
    /home/user/Downloads/wxWidgets-2.8.9/wincewppcstatic/bk-deps arm-mingw32ce-g++ -c -o bombs_bombs1.o -D__WXWINCE__     -I../../../demos/bombs  -I../../../demos/bombs/../../samples -D__WXWINCE__ -D__POCKETPC__ -I/home/user/Downloads/wxWidgets-2.8.9/wincewppcstatic/lib/wx/include/arm-mingw32ce-wince-unicode-release-static-2.8 -I../../../include -D__WXWINCE__ -D_WIN32_WCE=0x420 -D_WIN32_IE=0x400 -D__POCKETPC__ -DWX_PRECOMP -mthreads -fno-rtti -Wall -Wundef -Wno-ctor-dtor-privacy -O2 -fno-strict-aliasing ../../../demos/bombs/bombs1.cpp
    /home/user/Downloads/wxWidgets-2.8.9/wincewppcstatic/bk-deps arm-mingw32ce-g++ -c -o bombs_game.o -D__WXWINCE__     -I../../../demos/bombs  -I../../../demos/bombs/../../samples -D__WXWINCE__ -D__POCKETPC__ -I/home/user/Downloads/wxWidgets-2.8.9/wincewppcstatic/lib/wx/include/arm-mingw32ce-wince-unicode-release-static-2.8 -I../../../include -D__WXWINCE__ -D_WIN32_WCE=0x420 -D_WIN32_IE=0x400 -D__POCKETPC__ -DWX_PRECOMP -mthreads -fno-rtti -Wall -Wundef -Wno-ctor-dtor-privacy -O2 -fno-strict-aliasing ../../../demos/bombs/game.cpp
    arm-mingw32ce-windres -i../../../demos/bombs/bombs.rc -obombs_bombs_rc.o    --define __WXWINCE__        --include-dir ../../../demos/bombs  --include-dir ../../../demos/bombs/../../samples  --include-dir ../../../include
    arm-mingw32ce-g++ -o bombs.exe  bombs_bombs.o bombs_bombs1.o bombs_game.o bombs_bombs_rc.o    -L/home/user/Downloads/wxWidgets-2.8.9/wincewppcstatic/lib -mwindows  -mthreads       -lwx_winceu-2.8-arm-mingw32ce -lwxtiff-2.8-arm-mingw32ce -lwxjpeg-2.8-arm-mingw32ce -lwxpng-2.8-arm-mingw32ce  -lwxzlib-2.8-arm-mingw32ce  -lwxregexu-2.8-arm-mingw32ce -lwxexpat-2.8-arm-mingw32ce -mthreads  -loleaut32 -lole32 -luuid -lcommctrl -lcommdlg -lws2 -lceshell -laygshell   -loleaut32 -lole32 -luuid -lcommctrl -lcommdlg -lws2 -lceshell -laygshell
    Info: resolving vtable for std::basic_streambuf&lt;char, std::char_traits &gt; by linking to __imp__ZTVSt15basic_streambufIcSt11char_traitsIcEE (auto-import)
    Info: resolving std::cerr by linking to __imp__ZSt4cerr (auto-import)
    /opt/mingw32ce/lib/gcc/arm-mingw32ce/4.4.0/../../../../arm-mingw32ce/bin/ld: warning: auto-importing has been activated without --enable-auto-import specified on the command line.
    

    This should work unless it involves constant data structures referencing symbols from auto-imported DLLs.

    the resulting exe could not be run on the pocketpc

  19. I did some further investigations on this and found the following:

    To get rid compiler warnings you have to add
    -Wl,–enable-auto-import
    to the LDFLAGS in your Makefile. And don’t forget to copy the mingw32ce DLLs to you Windows Mobile device as well.

    However you still do not have any menues in your CE application. You can fix this by adding
    –define _WIN32_WCE
    to the line in the Makefile where windres is aclles. However I feel that it should probably be returend by calling
    /opt/wxWinCE-2.8.9/bin/wx-config –rescomp
    rather that the –define __WIN95__ that is returned at the moment

  20. I did some further investigations on this and found the following:

    To get rid of the compiler warnings you have to add
    -Wl,–enable-auto-import
    to the LDFLAGS in your Makefile. And don’t forget to copy the mingw32ce DLLs to you Windows Mobile device as well.

    However you still do not have any menues in your CE application. You can fix this by adding –define _WIN32_WCE to the line in the Makefile where windres is called. However I feel that it should probably be returend by calling
    /opt/wxWinCE-2.8.9/bin/wx-config –rescomp rather that the –define __WIN95__ that is returned at the moment

Leave a Reply

Your email address will not be published. Required fields are marked *

D.

DialogBlocks – Странный, но очень удобный способ создания интерфейса пользователя для Windows Mobile

Как и обещалось ранее в предыдущем посте о создании простейшего приложения для Windows Mobile, в этот раз речь пойдет о том, как быстро создать пользовательский интерфейс приложения для Windows Mobile с помощью DialogBlocks. Описывать подробно все аспекты пользования дизайнером пользовательских интерфейсов DialogBlocks я не буду, зато опишу последовательность действий, которая поможет начать пользоваться этим инструментом.

Итак, запускаем DialogBlocks и создаем новый проект (File -> New Project…)

В мастере указываем название проекта и каталог, в котором будет создан файл проекта.

На вкладке настройки параметров класса приложения указываем имя класса приложения, а также задаем имена файлов, в которые будет записан код класса приложения.

На вкладке настройки кодировки проекта указываем кодировки для файла проекта, файлов исходного кода и файлов ресурсов. Лучше всего указать <System>.

Отлично, проект создан и в него добавлен класс приложения. Теперь необходимо создать главное окно приложения. Для этого на панели инструментов жмем кнопку Element и в выпадающем меню выбираем пункт Add Frame.

В окне настройки параметров новой формы указываем имя класса формы и задаем имена файлов исходного кода для новой формы.

Теперь нам необходимо указать классу приложения, какая форма является главной. Для этого в дереве структуры проекта выбираем класс приложения и в окне настройки параметров в свойстве Main window указываем созданную ранее форму.

Теперь можно приступить к добавлению компонентов на форму. Добавляем вертикальный сайзер, в него панель, на нее еще вертикальный сайзер, в него многострочное текстовое поле. Затем на форму добавляем строку меню, на нее меню, в меню пункт меню Open, разделитель и пункт меню Exit

После того как компоненты добавлены, можно приступить к настройке их параметров.

В дереве структуры проекта выбираем панель, в окне свойств панели переходим на вкладку Styles и выставляем флаг wxNO_BORDER.

Переходим на вкладку Sizer, выставляем значение свойства Stretch factor в 1, поле Border в 0 и убираем флажки напротив свойств wxLEFT, wxRIGHT, wxTOP, wxBOTTOM. После всех этих манипуляций наша панель будет занимать все свободное пространство на форме.

В дереве структуры проекта выбираем текстовое поле, в окне свойств текстового поля переходим на вкладку Main и свойству Member variable name задаем значение m_MyTextCtrl.

Переходим на вкладку Sizer и свойство Stretch factor выставляем в 1. Этим мы указываем что текстовое поле должно занимать все свободное место на панели.

В дереве структуры проекта по очереди выбираем пункты меню Open и Exit и для каждого из них на вкладке Event handlers добавляем обработчик события wxEVT_COMMAND_MENU_SELECTED. Это событие выбора пункта меню.

Далее переходим на вкладку cpp и пишем код обработчиков событий для пунктов меню.

void MyMainFrame::OnEXITClick( wxCommandEvent & event )
{
    Close();
}

void MyMainFrame::OnOPENClick( wxCommandEvent & event )
{
    wxFileDialog dlg(this);
    if(dlg.ShowModal() == wxID_OK)
    {
        m_MyTextCtrl->LoadFile(dlg.GetPath());
    }
}

На этом работа непосредственно в DialogBlocks для нас закончена. Сохраняем все и открываем Visual Studio. Создаем новый проект (о том как это сделать я писал ранее) и добавляем в него файлы с исходным кодом, которые были созданы с помощью DialogBlocks.

Настраиваем свойства проекта и все, можно собирать.

Да, тут вот еще какая штука. DialogBlocks отображает создаваемые окна так, как они выглядят в ОС, в которой ведется работа. Т.е. если вы работаете в десктопной версии Windows, то, например, строка меню будет находиться вверху формы, в то время как в Windows Mobile строка меню будет размещаться внизу. Это своего рода неудобство, но со временем на него перестаешь обращать внимание, т.к. строка меню не мешает размещению остальных компонентов на форме и никак на них не влияет.

Вот так выглядит созданная нами форма в дизайнере DialogBlocks.

А вот так она выглядит на устройстве.


Ну вот, собственно, и все.

I.

Internet Explorer Mobile 6

В блоге Windows Mobile Team Blog появился анонс Internet Explorer Mobile 6, который уже сейчас можно пощупать, скачав образы Windows Mobile 6.1.4 для Microsoft Device Emulator.

Из новых возможностей отмечены:

  • Более точная отрисовка
  • Улучшения в размещении элементов страницы, в частности улучшения, связанные с переносом текста
  • Улучшена поддержка скриптов и AJAX ( заявлена поддержка Jscript v5.7 из Internet Explorer 8 )
  • Интеграция с поисковиками
  • Улучшена навигация курсором
  • Поддержка жестов (gestures)
  • Несколько уровней увеличения страницы (zoom levels)
  • Простой переход между мобильной и десктопной версией сайтов с помощью изменения User Agent-strings

Загрузить образы Windows Mobile 6.1.4 для Microsoft Device Emulator можно здесь.