安装GTK+/DirectFB图形环境
在学习了一段时间的GTK+图形编程后,考虑是否可以将该环境移植到嵌入式系统上,在网上查阅了相关资料后,确定了可行性,本文就是介绍了在虚拟机X86平台Linux系统下配置GTK+图形显示环境的过程。
一般的嵌入式系统使用MiniGUI、Qt/E、uC/GUI等图形环境,它们都是专业的面向嵌入式系统,经过专门裁剪后的集成包,相对比较成熟、安装方便,不过大部份都是商业版,在网上查阅了相关资料后,发现在嵌入式系统上构建GTK+的图形环境是完全可行的,但是整个环境由很多个源码包组成,依赖复杂,难度相对较大。
Linux系统常用的图形接口是FrameBuffer帧缓冲,实现了显存映射,生成了对应的/dev/fbX文件供用户操作,这需要内核打开相关选项。
本次实验在虚拟机上X86平台进行,可以为我们的第一次尝试去除交叉编译等不必要的麻烦,抓住主要矛盾。这里使用VirtualBox虚拟机,VirtualBox是目前个人感觉最好的虚拟机,比较简洁,不会给系统安装一大撮的服务;在上面安装了Red Hat Enterprise Linux AS4.0,使用AS4企业版,只因为一直使用的这个版本,感觉比较稳定,只安装基本的字符模式和开发包,差不多十分钟就能安装完成。
此时的系统只有字符界面,可以进行正常的编译、安装等开发工作,过会我们就要在上面实现基本的图形界面。
首先要确保内核打开了FrameBuffer支持选项,并且需要在系统启动参数中添加“vga=0×0314”,代表使用800*600分辨率,如果启动时能看到小企鹅图标,表明内核已经支持FrameBuffer,启动后查看是否有/dev/fb0等设备文件。
在这里首先说一下Linux系统编译安装源码包的注意事项,解开源码包有,首先查看README,看看基本功能介绍等,一般它会诉你如果要安装的话要查看哪个说明文件,一般都是INSTALL,在这个里面我们可以了解这个源码包依赖哪些包,以及编译安装方法,一般都是./configure、make、make install,当然要先安装它所依赖的源码包。
我以前一直不了解./configure里面的“–prefix”参数有什么大的用处,直接安装到默认路径不就行了吗,这也就给我的这次移植埋下了第一大隐患,在安装包的时候,系统中可能已经有一些早期版本,而早期版本一般都是安装在/usr目录下的,而我们的新版本,由于没有指定安装路径,一般都会安装到/usr/local下,导致版本冲突,调用的时候往往使用的还是老版本的可执行文件或库文件,所以安装一定要注意版本冲突问题。
因为Linux操作系统统一使用pkg-config工具来统一管理头文件路径和库路径,在新安装一个开发包后,会将一个开发包信息脚本放到pkg-config的目录下供其调用,而当系统中安装了不同版本的pkg-config,或者其它原因引起的,会同时存在两个pkg-config目录,一般都是/usr/lib/pkgconfig和/usr/local/lib/pkgconfig目录,而一般情况下系统只能搜寻前面的这个目录,所以有时候会导致,明明安装了那个开发包,却提示说pkg-config找不到,此时需要设置一个环境变量“export PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/local/lib/pkgconfig”就能解决,另外将“/usr/lib”和“/usr/local/lib”这两个路径加入到“/etc/ld.so.conf”并且执行“ldconfig”更新。
好了,如果在安装过程中出现开发包没安装,或库找不到的情况请对照以上两条解决。
首先进行编译安装DirectFB-1.4.1.tar.gz,没什么问题,顺利通过。编写以下测试程序并编译运行,如果能看到一条横线,那就成功了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include <stdio.h> #include <unistd.h> #include <directfb.h> static IDirectFB *dfb = NULL; static IDirectFBSurface *primary = NULL; static int screen_width = 0; static int screen_height = 0; #define DFBCHECK(x...) \ { \ DFBResult err = x; \ \ if (err != DFB_OK) \ { \ fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ ); \ DirectFBErrorFatal( #x, err ); \ } \ } int main (int argc, char **argv) { DFBSurfaceDescription dsc; DFBCHECK (DirectFBInit (&argc, &argv)); DFBCHECK (DirectFBCreate (&dfb)); DFBCHECK (dfb->SetCooperativeLevel (dfb, DFSCL_FULLSCREEN)); dsc.flags = DSDESC_CAPS; dsc.caps = DSCAPS_PRIMARY | DSCAPS_FLIPPING; DFBCHECK (dfb->CreateSurface( dfb, &dsc, &primary )); DFBCHECK (primary->GetSize (primary, &screen_width, &screen_height)); DFBCHECK (primary->FillRectangle (primary, 0, 0, screen_width, screen_height)); DFBCHECK (primary->SetColor (primary, 0x80, 0x80, 0xff, 0xff)); DFBCHECK (primary->DrawLine (primary, 0, screen_height / 2, screen_width - 1, screen_height / 2)); DFBCHECK (primary->Flip (primary, NULL, 0)); sleep (5); primary->Release( primary ); dfb->Release( dfb ); return 23; } |
在进行GTK+环境安装的时候出了很多问题,包括开发包的依赖问题,库找不到,undefined symbol: FcDirCacheLoad,mandatory image surface backend feature could not be enabled,提示重新安装FreeType和FontConfig等问题请参考上文方法解决,因为经历过磨难,这里就直接将正确的包的安装顺利和配置参数给出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | pkg-config-0.23.tar.gz ./configure make make install glib-2.20.4.tar.bz2 require pkg-config ./configure make make install 注:此包依赖新版本的pkg-config工具,因此在此之前对系统原有程序升级。 libpng-1.2.39.tar.bz2 ./configure make make install pixman-0.15.20.tar.gz ./configure make make install freetype-2.3.9.tar.bz2 ./configure make make install fontconfig-2.7.1.tar.gz ./configure make make install 注:此包依赖FreeType,如果已经安装TreeType但还提示找不到,请根据前文修改。 cairo-1.8.8.tar.gz ./configure --enable-directfb=yes --enable-ft=yes --enable-ps=no --enable-svg=no make make install 注:此包依赖libpng pixman fontconfig,注意Enable DirectFB。 pango-1.24.5.tar.bz2 ./configure make make install 注:依赖cairo glib atk-1.27.90.tar.bz2 ./configure --with-gtktarget-directfb --without-libtiff --without-libjpeg --without-libjasper make make install 注:注意GtkTarget DirectFB。 |
至此,开发包都已安装完毕,如果没有出错的话,那么我们就可以写一个GTK+代码进行测试,这里我写了一个最简单的窗体,包括一个按钮,单击按钮退出程序,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #include <gtk/gtk.h> int main( int argc, char *argv[] ) { GtkWidget *window; GtkWidget *button; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_set_size_request(GTK_WIDGET(window), 640, 480); button = gtk_button_new_with_label("Click Here"); g_signal_connect(window,"destroy", G_CALLBACK(gtk_main_quit),NULL); g_signal_connect(button,"clicked", G_CALLBACK(gtk_main_quit),NULL); gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(button)); gtk_widget_show_all(window); gtk_main(); return(0); } |
一切正常的话就会出现如下图,能看到鼠标,但标题栏没有,样子也很难后,颜色也许可以通过RC文件修改,但是在我的虚拟机上显示出的整
个图像好你宽度都变成的1/2,前面的DirectFB测试也是如此。

Moto,帮你顶啊。
唉,以后都没人给我分享文章了。