Благодаря стараниям Станислава Блинова у нас появилась возможность разрабатывать ПО для 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 *

Н.

Немного интересной информации о Windows Phone 7

Кое-какая информация о Windows Phone 7 OS утекла в сеть.
Что уже известно:

  • Разрабатывать можно будет на Silverlight
  • Для разработки можно будет пользоваться XNA
  • Векторный интерфейс будет на XAML
  • Для простых разработчиков будет возможность писать Managed код, для OEM-разработчиков планируется возможность написания нативных приложений
  • Будут Push-нотификации на всякго рода cсобытия

Сканы, вроде бы, официальных документов по этому поводу доступны здесь.