Nov
25

Настраиваем средства разработки для Windows Mobile (C++/wxWinCE) в Linux

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

Еще интересные посты о программировании для мобильных устройств:

23 Comments

Make A Comment
  • Alexander Said:

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

    Так держать 😉

  • T-Rex Said:

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

  • radcapricorn Said:

    Держать будем 😉

  • radcapricorn Said:

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

  • T-Rex Said:

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

  • radcapricorn Said:

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

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

  • radcapricorn Said:

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

  • T-Rex Said:

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

  • radcapricorn Said:

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

  • radcapricorn Said:

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

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

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

  • tonn Said:

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

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

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

  • T-Rex Said:

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

    • В Windows отдельный SDK для Windows Mobile и Windows CE, может есть какая-то разница в библиотеках. То что может под WM работать, теоретически может не работать под WinCE
    • Вы собрали wxWidgets и приложение не под ту архитектуру процессора. Если для ARM сборка под более ранние версии канает, то под XScale непример оно не заработает. Вы уверены что у вас правильная архитектура указана?
    • Как ведут себя приложения, собранные с wxWidgets под Windows на вашем устройстве? Они работают нормально?
    • По поводу меню, вы .rc файл добавляли в проект? Без файла ресурсов с меню будут очень большие проблемы. надо чтобы wx/msw/wx.rc был обязательно в проекте
  • tonn Said:

    Архитиктуру для сборки приложения испотзую такуюже как для сборки wx указаную в статье (arm-mingw32ce). На девайсе процессор i.MX21 (самый неизвестный в мире =)) но архитиктура у него армовская…

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

  • T-Rex Said:

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

  • tonn Said:

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

  • T-Rex Said:

    https://sourceforge.net/projects/habrasnake/
    Там сорцы и бинарник

  • tonn Said:

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

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

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

  • tonn Said:

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

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

  • T-Rex Said:

    Ответ отправил на почту.

  • al.zatv Said:

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

  • greiol Said:

    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

  • greiol Said:

    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

  • greiol Said:

    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

Comments RSS Feed   TrackBack URL

Leave a comment

Please leave these two fields as-is:

top