 | Минимальное приложение GTK+
Почему именно GTK+
Многие пользователи, уже работавшие с другими встроенными системами, хотят знать, почему нельзя использовать Qt. На самом деле можно, но делать этого не стоит. И GTK+, и Qt обычно собираются как библиотеки общего пользования; это означает, что все приложения GTK+ в вашей системе используют один и тот же экземпляр расположенного в памяти скомпилированного кода GTK+, а се приложения Qt используют один и тот же экземпляр Qt. Все стандартные приложения, предоставляемые с системой, используют GTK+, поэтому, если ваше приложение использует GTK+, оно будет использовать уже загруженный код. В этой среде приложение Qt потребовало бы значительно больше ресурсов. Это можно сравнить с выбором правостороннего или левостороннего движения в различных странах; несмотря на то, что у обоих вариантов есть свои аргументы, главное - чтобы все водители на дороге приняли одинаковые решения.
Минимальная программа GTK+
Я начну с минимальной программы, которая открывает окно и ничего не делает. Вам даже не нужно делать возможность "выхода", поскольку у всех телефонов есть отличный способ закрытия приложений—нажатие кнопки выключения. (На самом деле в эмуляторе это будет не совсем удобно, поскольку драйвер USB- клавиатуры перехватывает события с пробелом.)
Вот наша минимальная программа:
Листинг 3. Минимальная программа GTK
#include <gtk/gtk.h>
int
main(int argc, char *argv[]) {
GtkWidget *window;
gtk_init(&argc, &argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_widget_show(window);
gtk_main();
return 0;
}
|
Обновление параметров bitbake
Теперь создание параметров bitbake будет чуть сложнее. Во-первых, нужно указать, что приложение использует GTK+. Это можно сделать, введя строку DEPENDS = "gtk+". Вам также нужно обновить редакцию, потому что в противном случае bitbake не заметит изменений — простое изменение исходного кода не считается! Осталось всего одно изменение - командная строка, которая получается немного длинноватой. Вы не можете просто указать ссылку на libgtk—вам придется включить все директории и каждый используемый пакет в каждой директории. Завершающее правило do_compile() будет выглядеть следующим образом:
Листинг 4. Полная командная строка вызова компилятора
do_compile() {
${CC} ${CFLAGS} ${LDFLAGS} -Wl,-O1 -g -o hello ${WORKDIR}/hello.c \
-I ${STAGING_INCDIR}/pango-1.0 -I ${STAGING_INCDIR}/gtk-2.0 \
-I ${STAGING_INCDIR}/cairo -I ${STAGING_LIBDIR}/gtk-2.0/include \
-I ${STAGING_INCDIR}/glib-2.0 -I ${STAGING_INCDIR}/glib-2.0/glib \
-I ${STAGING_INCDIR}/atk-1.0 -lgtk-x11-2.0
}
|
На самом деле всё это нужно для включения множества директорий и одной библиотеки. Вам не нужно указывать путь библиотеки; библиотеки GTK+ располагаются на целевом устройстве в папке библиотек по умолчанию (/usr/lib), поэтому умолчание будет отлично работать.
Зачем включать столько директорий?
Для программы, в которую включается только <gtk/gtk.h>, необходимость указания семи дополнительных директорий может показаться лишней. Здесь есть две проблемы. Первая состоит в том, что основной заголовок GTK+ включает несколько других заголовков, которые, в свою очередь, также включают в себя заголовки. Вторая проблема состоит в том, что среда OpenMoko, как и некоторые другие системы, располагает дерево каждого пакета в отдельной вложенной директории, сокращая тем самым вероятность конфликтов. Ссылка <gtk/gtk.h> в этом случае обозначает /usr/include/gtk-2.0/gtk/gtk.h, но если у вас установлено несколько версий GTK+, изменение пути приведет к изменению получаемого заголовка, при этом не нужно обновлять множество исходных файлов.
Снова запуск и тестирование
Снова соберем приложение, используя make openmoko-devel-image. Вы должны увидеть, что приложение hello собрано заново. Теперь, если вы используете эмулятор, скопируйте его на телефон с помощью make flash-qemu-local. Если вы используете телефон, скопируйте файл любым удобным для вас способом. Запустите приложение и получите серый экран, который ничего не делает. Отлично! Задача здесь состояла не в том, чтобы что-то сделать, а в том, чтобы проверить правильность работы компиляции и сборки минимального приложения GTK+. Давайте теперь добавим немного функциональности.
|  |