GTK+DirectFB配置,编译
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
GTK+/DirectFB 配置,编译,使用的一系列文章
(本文作者从事图形开发, 通过这个链接可以找到他在cu的发帖, GUI方面的文章不错)
因为前段时间要将DirectFB移植一下,当然,我是修改fbdev.c里面来做的,因为目标平台只给来两个接口,一个是Create_Gc一个是Update_GC,所以需要作大量的修改才可以成功的将DirectFB移植到目标平台中,移植的过程中,也发现了一些问题,在这里总结一下,顺便把过程也发出来:
其实我编译的是DirectFB官方站发布版本的1.3.0版本,编译动态的当然运行起来也是没有问题的,在网上也是一搜一大筐的转贴,但是静态编译的时候,还真是伤脑筋,因为理论上按照常规的思路是没有问题的,但是在这里,理论和实践基本不挂钩,需要分析源代码以后才能发现其中问题,今天就先做一个配置和基本的编译,以后再慢慢的写源码分析。
拿到源代码第一步是找到README INSTALL看,然后configure配置,配置之前查看有哪些可以设置
[Copy to clipboard][ - ] CODE:
[**********************.0]#./configure--help
[**********************.0]#
根据上面的说明可以看到,我们可以设置自己需要的参数,比如我的是暂时先在pc上实验成功,然后在arm平台移植也就很容易了,因为那仅仅是一个编译器的问题了,当然,如果想像我一样移植到只有两个api的平台,那在代码上就要稍微有点改动了。
[Copy to clipboard][ - ] CODE:
[**********************.0]#./configure--prefix=/usr--enable-mmx=no
--enable-sse=no --enable-sdl=no --enable-gif=yes --enable-jpeg=yes
--with-gfxdrivers='none' --with-inputdrivers='none' --without-tools
--disable-fast-install --disable-libtool-lock --enable-png=yes --enable-video4linux=no --enable-debug=yes --enable-freetype=yes --enable-static=yes --enable-shared=no
--enable-x11=no --enable-trace=yes
--enable-trace=yes是为了我想在程序运行的时候打印函数的trace,例如
[Copy to clipboard][ - ] CODE:
[root@liuqi src]# ./example
~~~~~~~~~~~~~~~~~~~~~~~~~~| DirectFB 1.3.0
|~~~~~~~~~~~~~~~~~~~~~~~~~~
(c) 2001-2008 The world wide DirectFB Open Source Community
(c) 2000-2004 Convergence (integrated media) GmbH
----------------------------------------------------------------
(*) DirectFB/Core: Single Application Core. (2008-12-25 14:20)
[ DEBUG ][ TRACE ]
(*) Direct/Thread: Started 'VT Switcher' (-1) [CRITICAL OTHER/OTHER 0/0]
<10485760>...
(*) DirectFB/Graphics: Generic Software Rasterizer 0.6 ()
(*) DirectFB/Core/WM: Default 0.3 ()
(*) FBDev/Surface: Allocated 640x480 16 bit LUT8 buffer (index 0) at offset 0 and pitch 1600.
(-) [29527: -STACK- ]
#0 0x08107b50 in dfb_fbdev_pan ()
#1 0x08107fb0 in primarySetRegion ()
#2 0x080842e0 in set_region ()
#3 0x080856a0 in realize_region ()
#4 0x08085ca0 in dfb_layer_region_flip_update ()
#5 0x081156c0 in repaint_stack ()
#6 0x08115c90 in process_updates ()
………………………………略
[root@liuqi src]#
由于Trace太多,就不都放上来了。
仅仅是为了支持个画图,想要其他功能可以根据前面的configure提示的help来作修改
当configure后建立完makefile文件后,会给一个列表:
[Copy to clipboard][ - ] CODE:
Build options:
Version 1.3.0
Linux powered yes
Install prefix /usr
Config files in /usr/etc
Build shared libs no
Build static libs yes
Module directory ${exec_prefix}/lib/directfb-1.3-0
CPPFLAGS -D_REENTRANT
CFLAGS -O3 -ffast-math -pipe -g3 -fno-inline
-D_GNU_SOURCE -Werror-implicit-function-declaration
LDFLAGS
LIBS -lpthread
DYNLIB
THREADFLAGS -D_REENTRANT THREADLIBS
Misc options:
Multi Application Core no
Fusion Kernel Device N/A
Fusion message size 1024
Voodoo (network support) no
Debug supported yes
Debug enabled yes
Trace support no
MMX support no
SSE support no
Network support yes
Include all strings yes
Software Rendering yes
Smooth SW Scaling no
zlib compression no -lz
sysfs support no
Building Tests no
Building Tools no
Building System Modules:
Linux FBDev support yes
Generic /dev/mem support yes
X11 support no
OSX support no
SDL support no
VNC support no
Building Window Manager Modules:
Default yes
UniQuE no
Building Image Provider Modules:
GIF yes
JPEG yes -ljpeg PNG yes -lpng12 Building Video Provider Modules:
GIF yes
Video4Linux no (v2: no)
Building Font Modules:
FreeType2 yes -I/usr/include/freetype2 -lfreetype Default font yes
Building Graphics Drivers:
3Dfx Voodoo no
ATI Mach64 no
ATI Rage 128 no
ATI Radeon no
Cirrus EP9X no
Intel i810 no
Intel i830 no
Matrox no
NeoMagic no
NSC Geode no
nVidia no
Renesas SH7722 no
S3 Savage no
SiS 315 no
TI Davinci no
TI OMAP no
TVIA CyberPro no
VIA CLE266 no
VIA UniChrome no
VMWare no
--
OpenGL no (GLX: no)
Building Input Drivers:
DBox2 Remote no
DreamBox Remote no
Dynapro Touchscreen no
ELO Touchscreen no
Gunze Touchscreen no
H3600 Touchscreen no
Joystick no
Keyboard no
Linux Input no
LiRC no
MuTouch touchscreen no
PS/2 Mouse no
Serial Mouse no
SonyPI Jogdial no
tslib no
ucb1x00 Touchscreen no
WM97xx Touchscreen no
[**********************.0]#
对我的需求来说没用的我都没有使用,从上面列表可以看出
下一步就是make&&make install了,成功后,会发现在我之前configure的时候的--prefix的目录下指定的目录里,也就是
[Copy to clipboard][ - ] CODE:
/usr/lib
目录里有
[Copy to clipboard][ - ] CODE:
[**********************.0]#ls/usr/lib/libdirect*
/usr/lib/libdirect.a /usr/lib/libdirectfb.a /usr/lib/ /usr/lib/
[**********************.0]#ls/usr/lib/libfusion.*
/usr/lib/libfusion.a /usr/lib/
[**********************.0]#
这几个都是编译DirectFB的应用程序时要用到的,也许又的人好奇又的地方会有lo和la文件,其实他们这类属于libtool的文件
[Copy to clipboard][ - ] CODE:
[**********************.0]#file/usr/lib/
/usr/lib/: libtool library file
[**********************.0]#
这些文件暂时不用搭理他,我们用的就是标准的静态库文件(就是大伙常说的.a)文件
这几个是库文件,当然,如果自己观察编译动态的DirectFB库的话,会发现在lib下还又一些特殊的文件,这些在编译静态库的时候也会有一些特殊的文件的。
[Copy to clipboard][ - ] CODE:
[**********************.0]#ls-R/usr/lib/directfb-1.3-0/
/usr/lib/directfb-1.3-0/:
interfaces systems wm
/usr/lib/directfb-1.3-0/interfaces:
IDirectFBFont IDirectFBImageProvider IDirectFBVideoProvider
/usr/lib/directfb-1.3-0/interfaces/IDirectFBFont:
libidirectfbfont_default.a libidirectfbfont_dgiff.a libidirectfbfont_ft2.a libidirectfbfont_ libidirectfbfont_ libidirectfbfont_ libidirectfbfont_default.o libidirectfbfont_dgiff.o libidirectfbfont_ft2.o
/usr/lib/directfb-1.3-0/interfaces/IDirectFBImageProvider: libidirectfbimageprovider_dfiff.a libidirectfbimageprovider_ libidirectfbimag eprovider_jpeg.o
libidirectfbimageprovider_ libidirectfbimageprovider_gif.o libidirectfbimag eprovider_png.a
libidirectfbimageprovider_dfiff.o libidirectfbimageprovider_jpeg.a libidirectfbima geprovider_
libidirectfbimageprovider_gif.a libidirectfbimageprovider_ libidirectfbimag eprovider_png.o
/usr/lib/directfb-1.3-0/interfaces/IDirectFBVideoProvider: libidirectfbvideoprovider_gif.a libidirectfbvideoprovider_ libidirectfbvideoprov ider_gif.o
/usr/lib/directfb-1.3-0/systems:
libdirectfb_devmem.a libdirectfb_devmem.o libdirectfb_
libdirectfb_ libdirectfb_fbdev.a libdirectfb_fbdev.o
/usr/lib/directfb-1.3-0/wm:
libdirectfbwm_default.a libdirectfbwm_ libdirectfbwm_default.o
[**********************.0]#
因为我们编译动态的DirectFB的时候,fbdev是动态的,也就是shared object(又叫.so)的,当我们配置完ldconfig的时候,这里被调用就更灵活了,但是如果编译成静态的,恐怕有难度。
编译完成以后,可以写一个简单的测试程序来试一试
[Copy to clipboard][ - ] CODE:
/****************************************************
* Name: example.c
* Author: T-bagwell from ChinaUnix
* Note: Just for test the DirectFB
****************************************************/
#include <directfb.h>
#include <stdio.h>
#include <unistd.h>
int
main (int argc, char *argv[])
{
IDirectFB *dfb = NULL;
IDirectFBDisplayLayer *layer = NULL;
IDirectFBSurface *surface = NULL;
printf("liuqi is start\n");
DirectFBInit (&argc, &argv);
DirectFBCreate (&dfb);
dfb->GetDisplayLayer (dfb, DLID_PRIMARY, &layer);
layer->SetCooperativeLevel (layer, DLSCL_EXCLUSIVE);
layer->GetSurface (layer, &surface);
while(1)
{
surface->SetColor (surface, 0x0, 0xFF, 0, 0xff);
surface->FillRectangle (surface, 0, 0, 640, 480);
surface->SetColor (surface, 0xff, 0xFF, 0xFF, 0xff);
surface->DrawLine (surface, 0, 0, 640,480);
usleep(300);
}
surface->Release (surface);
layer->Release (layer);
dfb->Release (dfb);
return 0;
}
然后编译改例子程序
[Copy to clipboard][ - ] CODE:
[root@liuqi src]# gcc -D_REENTRANT -I/usr/include/directfb -D_GNU_SOURCE -Wall -O3 -pipe -Werror-implicit-function-declaration -o example example.c
/usr/lib/libdirectfb.a /usr/lib/libfusion.a /usr/lib/libdirect.a -lpthread
[root@liuqi src]# ./example
~~~~~~~~~~~~~~~~~~~~~~~~~~| DirectFB 1.3.0
|~~~~~~~~~~~~~~~~~~~~~~~~~~
(c) 2001-2008 The world wide DirectFB Open Source Community
(c) 2000-2004 Convergence (integrated media) GmbH
----------------------------------------------------------------
(*) DirectFB/Core: Single Application Core. (2008-12-25 14:20)
[ DEBUG ][ TRACE ]
(!) DirectFB/core/system: No system found!
(-) [29865: -STACK- ]
#0 0x08074590 in dfb_system_lookup ()
#1 0x080522f0 in dfb_core_create ()
#2 0x0804a2e0 in DirectFBCreate ()
(!) [29865: 0.000] --> Caught signal 11 (at 0x34, invalid address) <--
(-) [29865: -STACK- ]
#0 0x080f5d10 in signal_handler ()
已放弃
[root@liuqi src]#
大家都看到了,这个不是我的错,他编译的时候就已经编译过去了,而且没有报错,但是执行的时候却出错了,其实从Trace可以看出来他是挂在了
#0 0x08074590 in dfb_system_lookup ()处,这里就要去分析代码看他都作什么了,其实他的代码也很清晰的,有空再慢慢介绍。
当然,看源码分析后原理很简单,我们只要保证fbdev也在内存中,
dfb_system_lookup里面可以找到fbdev相关的模块,所以,在编译example.c的时候,最好也要把libfbdev.o加上:
[Copy to clipboard][ - ] CODE:
[root@liuqi src]# gcc -D_REENTRANT -I/usr/include/directfb -D_GNU_SOURCE -Wall -O3 -pipe -Werror-implicit-function-declaration -o example example.c
/usr/lib/libdirectfb.a /usr/lib/libfusion.a /usr/lib/libdirect.a -lpthread
/usr/lib/directfb-1.3-0/systems/libdirectfb_fbdev.o
[root@liuqi src]# ./example
~~~~~~~~~~~~~~~~~~~~~~~~~~| DirectFB 1.3.0
|~~~~~~~~~~~~~~~~~~~~~~~~~~
(c) 2001-2008 The world wide DirectFB Open Source Community
(c) 2000-2004 Convergence (integrated media) GmbH
----------------------------------------------------------------
(*) DirectFB/Core: Single Application Core. (2008-12-25 14:20)
[ DEBUG ][ TRACE ]
(*) Direct/Thread: Started 'VT Switcher' (-1) [CRITICAL OTHER/OTHER 0/0]
<10485760>...
(*) DirectFB/Graphics: Generic Software Rasterizer 0.6 ()
(!) DirectFB/WM: Window manager module 'default' not found!
(-) [29872: -STACK- ]
#0 0x0805c6e0 in load_module ()
#1 0x0805cc70 in dfb_wm_core_initialize ()
#2 0x080709b0 in dfb_core_part_initialize ()
#3 0x08052c10 in dfb_core_initialize ()
#4 0x08052e90 in dfb_core_arena_initialize ()
#5 0x080f20f0 in fusion_arena_enter ()
#6 0x08052450 in dfb_core_create ()
#7 0x0804a440 in DirectFBCreate ()
(!) DirectFB/Core: Could not initialize 'wm_core' core!
--> No (suitable) implementation found!
(-) [29872: -STACK- ]
#0 0x080709b0 in dfb_core_part_initialize ()
#1 0x08052c10 in dfb_core_initialize ()
#2 0x08052e90 in dfb_core_arena_initialize ()
#3 0x080f20f0 in fusion_arena_enter ()
#4 0x08052450 in dfb_core_create ()
#5 0x0804a440 in DirectFBCreate ()
(!) [29872: 0.000] --> Caught signal 11 (at 0x34, invalid address) <--
(-) [29872: -STACK- ]
#0 0x080f5e70 in signal_handler ()
已放弃
[root@liuqi src]#
执行的时候又提示出错了,这个时候提示是死在了窗口管理器上,所以,同样的道理,更详细的话还是需要分析源代码。
简单的说,就是需要吧wm.o也加进去
[Copy to clipboard][ - ] CODE:
[root@liuqi src]# gcc -D_REENTRANT -I/usr/include/directfb -D_GNU_SOURCE -Wall -O3 -pipe -Werror-implicit-function-declaration -o example example.c
/usr/lib/libdirectfb.a /usr/lib/libfusion.a /usr/lib/libdirect.a -lpthread
/usr/lib/directfb-1.3-0/systems/libdirectfb_fbdev.o
/usr/lib/directfb-1.3-0/wm/libdirectfbwm_default.o。