Настраиваем средства разработки для 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
- Нам понадобится Bakefile. Если его нет (или если он древнее, чем 2.3.0) – взять можно на www.bakefile.org. Эта утилита будет новые Makefile’ы создавать.
- Теперь надо скачать архив wxWidgets-2.8.9 и куда-нибудь его распаковать. Все остальные действия надо производить, находясь в директории wxWidgets-2.8.9. (Здесь и далее на скриншотах зеленым выделены моменты, на которые стоит обратить внимание).
-
tar xzf wxWidgets-2.8.9.tar.gz
- Прилагаемый файл autogen.mk помещается в директорию build. Затем можно применить патч.
-
cp /home/capricorn/work/articles/mingw32ce-wxWinCE/autogen.mk build patch -p0 /home/capricorn/work/articles/mingw32ce-wxWinCE/wxWinCE.patch-2
- Немного поправим 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. При желании можете посмотреть, где точно они располагаются в этом файле, и добавить их в те же места.
- Этот шаг необходимо выполнить, если Bakefile у вас не 2.3.0 (здесь я отметил файлы, которые должны быть заменены). Путь
/usr/local/share/aclocal
, естественно, действителен для Debian. На другой системе может быть другим.
cp /usr/local/share/aclocal/bakefile* build/aclocal
- Теперь нужно создать новые билд-скрипты
./autogen.sh && make -f build/autogen.mk
Процесс займет некоторое время, в результате должно получиться примерно следующее:
- Выполнение этого шага сконфигурирует среду на сборку статической монолитной библиотеки с поддержкой юникода. Опция
--prefix
нужна, чтобы указать, куда впоследствии будет инсталлироваться wxWinCE. Посколькуmingw32ce
у меня лег в/opt
, wxWinCE я решил положить рядышком, так что я выбрал--prefix=/opt/wxWinCE-2.8.9
:
По завершении конфигурации вы должны получить такую картину:
- Теперь остается только выполнить
$ make
И можно смело идти пить кофе. Когда же, наконец-таки, все будет собрано, останется только проинсталлировать:$ sudo make install
Последний шаг нужно выполнять от имени root’а (если только вы не поставили в
--prefix
директорию, в которую вам разрешена запись). Так что – либоsudo
, либоsu
.Вот и все. Теперь можно смело собирать сэмплы или свои собственные приложения. Для получения флагов компилятора не забывайте использовать
/bin/wx-config. Примерно таким же образом можно собрать и динамическую, и debug библиотеку (см. configure --help
). Вот только чтобы собрать wxWinCE для смартфона надо руками править configure. К сожалению, я не спец по autotools. То, что было необходимо подправить – догадался, откопал, подсмотрел… А по-хорошему надо бы дописать строчки в configure.in, чтобы после autogen скрипт configure позволял бы с помощью опций указать версию WinMobile и тип платформы. Но это уже будет, видимо, другая история…
Еще интересные посты о программировании для мобильных устройств:
- Собираем wxWinCE, C++ библиотеку для разработки GUI приложений под PocketPC!
- Hello World для Sony PlayStation Portable (Linux)
- Первое приложение для Windows Mobile на C++/wxWinCE
- Инструкция по запуску Debian GNU/Linux на Neo FreeRunner
- Собираем собственный дистрибутив Embedded Linux на базе OpenEmbedded
23 Comments
Make A CommentComments RSS Feed TrackBack URL
November 26th, 2008 at 12:26
Обалдеть, работа проделана большая, автор молодец. Надо будет на досуге попробовать
Так держать
November 26th, 2008 at 13:44
Угу, уже самому нетерпится попробовать… может на выходных. Но идея сама по себе очень неплохая. Если еще разобраться с отладкой приложений для Windows Mobile под Linux, то будет вобще супер.
November 27th, 2008 at 14:29
Держать будем
November 30th, 2008 at 01:01
Девелопер на трекере-таки попросил все это дело на svn сконвертить. Эх… придется попотеть
November 30th, 2008 at 01:23
Эээ.. не понял хода мысли..
Ты делаешь патч для официальной версии wx?
November 30th, 2008 at 05:29
Ну а почему бы и да?
Вообще я просто отправил все как есть в ветку патчей для 2.8.9, но там господин был сильно “afraid of applying it to stable version” и спросил, могу ли я это на svn применить.
В конце концов, если однажды можно будет скачать wxWidgets-*.tar.gz и собрать wxWinCE с помощью mingw32ce без всяких патчей, я буду только рад, и думается мне, что не только я
December 1st, 2008 at 14:22
Ну вот, svn-патчу поставили статус ‘new’. Обещают на этой/следующей неделе вынести вердикт, первоначальная оценка положительная. Кстати, немного подразобрался с autotools’ами, так что сегодня/завтра сделаю еще одну, “правильную” редакицю патча для 2.8.9
December 1st, 2008 at 15:57
Ждем-с…
Об видео не думал? Что-то у меня со временем не складывается, но если надумаешь сделать скринкаст, я могу подредактировать/порезать/сконвертить в нормальный формат для загрузки 
December 1st, 2008 at 16:03
Можно… Коли не забуду, поставлю на запись, когда закончу патч твикать и буду делать тестовый билд
December 13th, 2008 at 21:46
Ухх, долгий получился перерыв, однако вернулся я все-таки к данной теме.
Касательно официального патча – с ним есть некоторые проблемы, обусловленные, эмм, не совсем корректными заголовочными файлами от mingw32ce. Разработчики данного чуда обещали поправить, после чего видимо г-н Zeitlin рассмотрит применение патча на svn.
А видео жди завтра, сейчас как раз патч для 2.8.9 ломаю
January 27th, 2009 at 15:07
Добрый день.
Столкнулся с несколькими проблемами при использовании описаной выше сборки.
1. wx-config про(тестовый аппарат RoverPC W5 wm5.0).сит в параметры компилятора добавить -mthreads но с таким флагом собраные приложения не хотят запускаться под wince
2. Меню (сделаные как в соседней статьй про простейшее приложение) не работаю… точнее их вообще нет…. нижняя часть окна (там где кнопка вызова клавиатуры и меню) просто прозрачная и сквозь нее видно фоновое приложение…
Остальное в целом работает…. хотя я слишком глубоко не капал…
Спасибо за статью, надеюсь решение моих проблем найдется.
January 27th, 2009 at 16:12
Это скорее к radcapricorn’у вопрос.
Навскидку можно так подумать что:
January 27th, 2009 at 16:45
Архитиктуру для сборки приложения испотзую такуюже как для сборки wx указаную в статье (arm-mingw32ce). На девайсе процессор i.MX21 (самый неизвестный в мире =)) но архитиктура у него армовская…
Файл ресурсов дал только икконку приложения, на меню ни как не повлеял =(
January 27th, 2009 at 16:51
Хм.. ладно. А все же попробуйте пересобрать под Windows ваше приложение. Я помню у меня была определенная разница в поведении в VC++ и MinGW версии десктопного приложения. Может и для мобильных есть разница.
Если собранная под Win версия будет работать как надо, тогда можно будет еще подумать.
January 27th, 2009 at 17:05
не имею возможности =(
если у вас есть простейшее приложение собраное под vc++ не могли бы вы его выложить? (бинарник + исходник) тогда я соберу его под cegcc и сравню работу моей сборки и вашей на своем кпк…
January 27th, 2009 at 17:30
https://sourceforge.net/projects/habrasnake/
Там сорцы и бинарник
January 28th, 2009 at 09:24
HabraSnake собралась но пока не отключил mthread незапускалась…
Меню тоже нету – но все остальное работает нормально…
Видимо дело в сдк в комплекте с cegcc =(
February 15th, 2009 at 16:35
Тема заглохла? =(
хотелось бы всетаки допилить… но я даже не знаю куда копать =(
February 15th, 2009 at 16:45
Ответ отправил на почту.
April 20th, 2009 at 09:50
аааааа зверюга! даже и представить себе не мог, что можно под линуксом wxWidgets для winMobile собрать.
March 9th, 2010 at 00:34
Hello, I tried this with a certain degree of success. However after building wxWidgets I tried to build the demos and got
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
March 21st, 2010 at 23:04
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
March 21st, 2010 at 23:05
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