摘 要 随着数字信息技术和网络技术的发展,人们已经进入数码时代。建立在它们基础之上的嵌入式系统已经广泛地渗透到科学研究、工程设计、军事技术以及人们的日常生活等方方面面。由于嵌入式系统越来越复杂、功能也越来越多,开发嵌入式的GUI应用程序已经成为一种必然的趋势。本文将讨论开发嵌入式GUI的技巧和用GTK工具开发Linux嵌入式GUI应用程序的方法和步骤。
关键词 嵌入式 GUI GTK Linux
在很早以前,有类似嵌入式GUI的应用程序出现,不过它们都十分简单,只可称之为嵌入式GUI的雏形。近几年来,随着数字电子技术与网络技术的发展,面向嵌入式的硬件种类越来越多,性能越来越好,同时人们对嵌入式系统的要求也越来越高,于是开发嵌入式GUI应用程序成为嵌入式系统的一个必然发要求。
引用一个概念,所谓GUI(Graphics User Interface)即图形用户界面。其广泛流行是当今计算机技术的重大成就之一,它极大地方便用户的使用,人们可以不再像在DOS时代那样要记一大堆枯燥的指令来操作计算机,而只要通过鼠标轻点几下,就可以完成大部分工作。如今大部分GUI都是指在PC机上工作的,可它们并适合用于嵌入式系统。由于嵌入资源有严格的限制,它对GUI也有特殊的要求。
一、用GTK开发嵌入式GUI应用程序
GTK是GIMP Toolkit的缩写,是目前编写图形界面比较流行的高层函数库之一。Linux的主流桌面系统之一的GNOME就是用GTK开发出来的。GTK本是在通用PC机上使用,不是专为嵌入式系统开发的。但由于它的模块化设计和全C编写的特性,兼容性好,运行稳定,且它的库也比较小,GTK加上X服务器仅占用2.9M的硬盘空间,兼顾考虑性能和存储空间,它完全可以用于开发嵌入式的GUI应用程序,且具有免费从网上获取源代码的优点。
要开发GTK应用程序,最先做的是当然是从网上下载一份源代码并安装。安装步骤如下:
1、 从民网上下载GTK源代码包,将其拷贝到开发平台的指定目录下。
2、 进入Linux操作系统,打开终端应用程序,在控制台下切换当前目录至GTK的源代码包的目录下。
3、 键入以下命令:
% gzip -cd gtk-1.2.10.tar.gz | tar xvf - # 在当前目录下解开源代码压缩包
% cd gtk-1.2.10 # 进入GTK源代码包的最高层目录
% ./configure # 产生Makefile文件
% make # 编译GTK源代码
(以下必要时必须切换到ROOT管理权限)
% rm -rf /install-prefix/include/gtk /install-prefix/include/gdk
# 删除旧版本的GTK(若有)
% make install # 进行安装
4、为加快图形程序开发的速度,还要安装glade1.2这个GTK开发的辅助工具,其源代码包可从相关网站下载。若用RedHat操作系统,可以通过选择软件组件来安装它。
GTK需要的支持库主要有GLIB图形底层函数库、GDK函数库及一些图形显示处理和数学库。前两者在GTK源代码中已经包含,其他的库一般的Linux系统内核均带有。
二、用GLADE解决GTK界面布局问题
在Linux下开发GUI应用程序不像在Windows下那样方便,因为它没有集成开发环境,要自己定好编译文件Makefile,就像开发DOS程序那样。又由于GUI的特点,必须定位显示在屏幕上控件的位置,而如果没有集成开发环境,光用程序定位就十分烦琐,因此必须借助第三方的开发工具。
glade是专为开发GTK应用程序而设计的辅助工具,虽然它不像Windows下的VB、VC++那样本身带有编译调试系统,但是对布局GTK的控件、调整界面的大小却十分有用,它可以生成界面布局的源代码。
Glade生成的源代码主要有main.c, interface.c, callbacks.c, support.c和相关的编译所需的文件如Makefile等,这些代码生成了整个应用程序的主要框架,其中main.c是主引导程序很简单,主要完成初始化的工作。interface.c是界面布局程序,support.c包含有一些必要的支持函数,callbacks.c是回调函数文件,也是整个应用程序的主体,glade只能生成相关的函数名,绝大部分靠人工手写,它完成了应用程序的主体功能。
用glade新建一个工程,布局好控件界面后,在控制台下切换到该工程所在的最高层目录,鍵入./autogen.sh即可生成Makefile,下次改程序时,只要在callbacks.c里面编辑即可,编辑完程序后切换到工程所在的src目录下,那里有一个Makefile文件,在命令行键入make命令便可以编译出可执行程序。也可以自己写Makefile,那样比glade自动生成的要简洁得多,根据嵌入式目标系统的特点,本文采用了后者这种方法。
三、编写Makefile文件编译程序
程序写好后,要真正运行起来还有赖于编译系统的编译,而Makefile文件是不可缺少的一环。如今一般的软件工程都使用多文件的项目,它将完成功能类似的源代码集中到一个文件里,通过头文件及声明来相互联系。这样做的目的是减少编译的时间,不至于每次为了一个小小的改动而编译整个项目,同时维护和修改代码时也比较容易。
为了实现多文件项目的管理和编译,现在的Linux系统主要用的是GNU MAKE工具,由软件项目的Makefile文件来实现。编译程序时,GNU MAKE会读入其对应的Makefile文件,该文件主要是指定各个目标文件(常指执行程序、二进制模块和动静态库)是从哪些源代码文件(也称依靠文件)产生,用什么样的命令和规则来进行这个产生过程。有了相关的信息,Make工具就会检查硬盘上的文件,如果目的文件的时间戳比至少一个它的依靠文件旧的话,Make就会重新编译这个依靠文件以生成新的目标文件。Make默认找的文件名是Makefile,也可以在命令行指定别的文件名。关于Makefile文件的语法规则请参考相关文献[]。
由glade产生的Makefile文件太过繁杂,采用自编写的Makefile文件维护和升级都比较容易。对GTK+采用动态编译的方式,也可采用静态方式。如本嵌入式系统GTK要用到GDK_PIXBUF函数库就要用静态编译,因为嵌入式系统的C库版本太低。如要编译的目标文件名为initform,则Makefile文件内容如下所示:
#THE FOLLOWING IS MY MAKEFILE
CC = gcc
CFLAGS= -Wall -O3 -g
GTK_CONFIG_CFLAGS=`gtk-config --cflags` -I/usr/include/gdk-pixbuf-1.0/
GTK_CONFIG_LIBS= `gtk-config --libs` -Wl,-Bstatic -lgdk_pixbuf
initform: main.o support.o interface.o callbacks.o
$(CC) main.o support.o interface.o callbacks.o -o initform $(GTK_CONFIG_LIBS)
main.o: main.c support.h interface.h callbacks.h
$(CC) $(CFLAGS) -c main.c -o main.o $(GTK_CONFIG_CFLAGS)
support.o: support.c support.h
$(CC) $(CFLAGS) -c support.c -o support.o $(GTK_CONFIG_CFLAGS)
interface.o: interface.c interface.h support.h callbacks.h
$(CC) $(CFLAGS) -c interface.c -o interface.o $(GTK_CONFIG_CFLAGS)
callbacks.o: callbacks.c callbacks.h support.h interface.h
$(CC) $(CFLAGS) -c callbacks.c -o callbacks.o $(GTK_CONFIG_CFLAGS)
clean:
rm -f *.o initform
其中-Wl,-Bstatic是静态编译的选项,GTK用默认的配置程序gtk-config –libs 设置库和头文件的路径,它使用动态编译方式。生成Makefile文件后,在控制台下输入make命令,嵌入式的GUI应用程序就生成了。
参考文献
1 李善平,刘文峰,王焕龙. Linux与嵌入式系统. 清华大学出版社,2002
2 邹思轶. 嵌入式Linux设计与应用. 清华大学出版社,2002
3 王学龙. 嵌入式Linux系统设计与应用. 清华大学出版社,2001
4 于明俭,陈向明,方汉. Linux程序设计权威指南. 机械工业出版社,2001
5 联想软件超星空工作室. 精通Linux系统管理与应用开发技术. 清华大学出版社,2001
6 李主琛. Linux面向对象窗口高级编程. 科学出版社,20015
7 徐千洋. Linux 函数库参考手册. 中国青年出版社,200
8 吴向峰. GNOME/GTK+编程宝典. Arthur Griffith. 电子工业出版社,2000
|