安装GTK+/DirectFB图形环境

Posted: 八月 26th, 2009 | Views: 2,234 次浏览 | 2 Comments »

在学习了一段时间的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测试也是如此。

GTK+ DirectFB Pic

GTK+ DirectFB Pic

Filed under: 学习分享 | Tags: , , ,

2 Comments on “安装GTK+/DirectFB图形环境”

  1. Aaron 说:

    Moto,帮你顶啊。


Leave a Reply

  • Name
  • Mail (will not be published)
  • Website
Page 1 of 0