Chinaunix首页 | 论坛 | 博客
  • 博客访问: 473369
  • 博文数量: 59
  • 博客积分: 345
  • 博客等级: 二等列兵
  • 技术积分: 1380
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-18 22:44
个人简介

to be myself

文章分类

全部博文(59)

文章存档

2017年(5)

2013年(47)

2012年(3)

2011年(4)

分类: 嵌入式

2013-03-03 12:56:37

采用交叉编译方式
【软件环境】
PC:ubuntu  10.04
开发板:Linux  2.6.32.2@2440
Target:  arm-none-linux-gnueabi
gcc  version  4.4.3

编译minigui3.0并移植需要的文件有
(基本上都是比较新的版本,有些库文件在我尝试后还是选择了比较旧的版本):
FreeType库:
minigui字体引擎
freetype-1_3_1.tar.gz

JPEG库:
minigui显示jpeg图片
jpegsrc.v8c.tar.gz

png库:
minigui显示png图片
libpng-1.0.59.tar.gz

zlib库:
minigui数据压缩函数库
zlib-1.2.6.tar.gz

minigui所用到的资源
minigui-res-be-3_0_12.tar.gz

minigui核心库
libminigui-gpl-3_0_12.tar.gz

minigui样例
mg-samples-3_0_12.tar.gz

Step1:
建立工作目录,如/home/profiles/minigui,将上述*.tar.gz放入该目录,并解压
tar  xzf  freetype-1_3_1.tar.gz
tar  xzf  jpegsrc.v8c.tar.gz
tar  xzf  libpng-1.0.59.tar.gz
tar  xzf  zlib-1.2.6.tar.gz
tar  xzf  minigui-res-be-3_0_12.tar.gz
tar  xzf  libminigui-gpl-3_0_12.tar.gz
tar  xzf  mg-samples-3_0_12.tar.gz

Step2:
[编译Freetype库]
cd  freetype-1.3.1/
(A)./configure  --host=arm-linux  --enable-static  --prefix=/usr/local/minigui
修改Makefile
12行  all:  ttlib  ttest  ttpo为all:  ttlib  ttpo
34行  注释(或删)掉,即#cd   $(FTTESTDIR);  $(MAKE)  -f  $(MAKEFILE)  install
否则make就会出现下面的错误
ftdump.c:172:1:  error:  pasting  "."  and  "glyph_object"  does  not  give  a  valid  preprocessing  token
ftdump.c:182:1:  error:  pasting  "."  and  "first_instance"  does  not  give  a  valid  preprocessing  token
ftdump.c:191:1:  error:  pasting  "."  and  "second_instance"  does  not  give  a  valid  preprocessing  token
ftdump.c:201:1:  error:  pasting  "."  and  "face_object"  does  not  give  a  valid  preprocessing  token
ftdump.c:202:1:  error:  pasting  "."  and  "glyph_object"  does  not  give  a  valid  preprocessing  token
ftdump.c:203:1:  error:  pasting  "."  and  "second_instance"  does  not  give  a  valid  preprocessing  token
(B)make
(C)make  install

[编译JPEG库]
cd  jpeg-8c/
(A)修改configure(vi  configure)在文件开始的位置加上
CC=arm-linux-gcc
CXX=arm-linux-g++
LD=arm-linux-ld
AS=arm-linux-as
AR=arm-linux-ar
如(后面的库的编译修改configure亦如此):
##   M4sh  Initialization.  ##
##   --------------------  ##

#   Be  more  Bourne  compatible
C=arm-linux-gcc
CXX=arm-linux-g++
LD=arm-linux-ld
AS=arm-linux-as
AR=arm-linux-ar
DUALCASE=1;  export  DUALCASE  #   for  MKS  sh
if  test  -n  "${ZSH_VERSION+set}"  &&  (emulate  sh)  >/dev/null  2>&1;  then  :

(B)./configure  --prefix=/usr/local/minigui  --build=i386-linux  \
--host=arm-linux  --target=arm-linux  --enable-shared
(C)make
(D)make  install

[编译PNG库]
cd  libpng-1.0.59/
(A)修改configure(vi  configure)在文件开始的位置加上
CC=arm-linux-gcc
CXX=arm-linux-g++
LD=arm-linux-ld
AS=arm-linux-as
AR=arm-linux-ar
(B)./configure  --prefix=/usr/local/minigui  --build=i386-linux  \
--host=arm-linux  --target=arm-linux
(C)make
(D)make  install

[编译zlib库]
cd  zlib-1.2.6/
(A)修改configure(vi  configure)在文件开始的位置加上
CC=arm-linux-gcc
CXX=arm-linux-g++
LD=arm-linux-ld
AS=arm-linux-as
AR=arm-linux-ar
(B)./configure  --prefix=/usr/local/minigui  --shared
(C)make
(D)make  install

[编译资源库]
cd  minigui-res-be-3.0.12/
(A)修改configure(vi  configure)在文件开始的位置加上
CC=arm-linux-gcc
CXX=arm-linux-g++
LD=arm-linux-ld
AS=arm-linux-as
AR=arm-linux-ar
(B)./configure  --prefix=/usr/local/minigui
(C)make
(D)make  install

[编译核心库]
cd  libminigui-gpl-3.0.12/
(A)修改configure(vi  configure)在文件开始的位置加上
CC=arm-linux-gcc
CXX=arm-linux-g++
LD=arm-linux-ld
AS=arm-linux-as
AR=arm-linux-ar
CFLAGS="-I/usr/local/minigui/include -I/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/include "
CPPFLAGS="-g -I/usr/local/minigui/include -I/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/include "
CXXFLAGS="-g -I/usr/local/minigui/include -I/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/include "
(此处要特别注意,我用的编译器所在目录为/opt/FriendlyARM/toolschain/4.4.3,注意跟自己环境的差异,下面的示例库编译亦然)
(B)./configure  --prefix=/usr/local/minigui  --host=arm-linux  \
--target=arm-linux  --build=i386-linux  --with-osname=linux  \
--with-style=classic  --with-targetname=fbcon  --enable-autoial  \
--enable-rbf16  --disable-vbfsupport  --enable-tslibial
(上面的--enable-tslibial选项是minigui支持触摸屏必选的选项,后面会讲到)
(C)make
(D)make  install

[编译示例库]
cd  mg-samples-3.0.12/
(A)修改configure(vi  configure)在文件开始的位置加上
CC=arm-linux-gcc
CXX=arm-linux-g++
LD=arm-linux-ld
AS=arm-linux-as
AR=arm-linux-ar
CFLAGS="-I/usr/local/minigui/include -I/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/include "
CPPFLAGS="-g -I/usr/local/minigui/include -I/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/include "
CXXFLAGS="-g -I/usr/local/minigui/include -I/opt/FriendlyARM/toolschain/4.4.3/arm-none-linux-gnueabi/include "
(B)./configure  --prefix=/usr/local/minigui  --build=i386-linux  \
--host=arm-linux  --target=arm-linux
(C)make
这里应该会出错,是因为Makefile里的参数不对,程序找不到链接库,这么多Makefile,需要修改哪一些呢?
查看根目录下的Makefile(vi  Makefile),(line  204)会发现:
COMMON_SUBDIRS  =  same  graphics  housekeeper  minesweeper  ctrl_dlg  \
                                  lf_skin  font_text  look_feel  dbuff  notebook
same  graphics  ...  notebook这几个目录会按顺序依次被make,查看刚才出错的信息,肯定是same首先没被编译通过。
这么多示例程序,我们暂时只需要1个验证移植是否成功就好了。选个notebook先来编译吧。
a.
将notebook放到最前面,即COMMON_SUBDIRS  =  notebook  same  graphics  housekeeper  minesweeper  ctrl_dlg  \
                                  lf_skin  font_text  look_feel  dbuff
    将LIBS修改为
    LIBS  =  -lminigui_ths  -ljpeg  -lm  -lpthread  -ldl  -lpng  -lts
    LDFLAGS修改为
    LDFLAGS  =  -L/usr/local/minigui/lib
    保存Makefile
b.
    vi  notebook/Makefile
    将LIBS修改为
    LIBS  =  -lminigui_ths  -ljpeg  -lm  -lpthread  -ldl  -lpng  -lts
    LDFLAGS修改为
    LDFLAGS  =  -L/usr/local/minigui/lib
c.
      vi  notebook/res/Makefile
      将LIBS修改为
        LIBS  =  -lminigui_ths  -ljpeg  -lm  -lpthread  -ldl  -lpng  -lts
        LDFLAGS修改为
        LDFLAGS  =  -L/usr/local/minigui/lib

至此,编译过程完成了。
[拷贝]
(注:我用的NFS网络文件系统,路径为/home/profiles/2440/rootfs,注意环境差异)
(A)拷贝刚刚编译完成的notebook到根文件系统的bin目录下
cp  ./notebook/notebook  /home/profiles/2440/rootfs/bin
此时并不能再开发板上运行,因为我们编译的各种库文件尚未拷贝过去
(B)拷贝编译生成的所有必需文件(拷贝到开发板根文件系统的usr/local目录)
cp  /usr/local/minigui/* /home/profiles/2440/rootfs/usr/local/ -dr

vi /usr/local/etc/MiniGUI.cfg
gal_engine=pc_xvfb
defaultmode=800x600-16bpp

# IAL engine
ial_engine=pc_xvfb
mdev=/dev/input/mice
mtype=IMPS2

[fbcon]
defaultmode=1024x768-16bpp

修改为:
gal_engine=fbcon
defaultmode=320x240-16bpp

# IAL engine
ial_engine=tslib
mdev=/dev/input/event0
#/dev/input/event0为触摸屏设备节点,不同的驱动有所差异
mtype=IMPS2

[fbcon]
defaultmode=320x240-16bpp
(D)在rootfs下创建/etc/ld.so.conf,写入
/usr/local/lib
/usr/lib
/lib
(E)在虚拟机下执行ldconfig -r /home/profiles/2440/rootfs
-r后面的目录是根文件系统所在目录
(F)修改启动脚本加上
vi /etc/init.d/rcS

/bin/ln –s/dev/vc/0/dev/tty0
否则会出现
NEWGAL>FBCON:Can't open/dev/tty0 : No such file or directory
NEWGAL:Set video mode failure.
InitGUI:Can not initialize graphics engine!
[测试]
(A)如果使用了Qtopia,杀掉原先的/opt/Qtopia/bin/qpe进程。
比如我的
ps命令
686 root     18248 S    /opt/Qtopia/bin/qpe
kill -9 686
(B)执行notebook &

现在可以编译一下其它的程序,可能有的有诸如这样的错误:
./graphics: symbol lookup error: /usr/local/lib/libminigui_ths-3.0.so.12: undefined symbol: ts_open

ts_open函数没发现,只是因为在编译核心库的时候,虽然加上了-lts,但是在/usr/local/minigui/lib中并没有tslib的库文件,
以上的操作的前提是编译过tslib,然后将所需要的库文件拷贝到/usr/local/minigui/lib重新编译一遍minigui核心库和示例库
这三个文件可以从开发板上拷贝到虚拟机上。
lrwxrwxrwx    1 root     root           18 Oct  8  2011 /usr/local/lib/libts-0.0.so.0 -> libts-0.0.so.0.1.1
-rwxr-xr-x    1 root     root         9612 Oct  8  2011 /usr/local/lib/libts-0.0.so.0.1.1
lrwxrwxrwx    1 root     root           18 Oct  8  2011 /usr/local/lib/libts.so -> libts-0.0.so.0.1.1

看一下源码,为何知道要用触摸屏时,必须选上。
当用一个未知IAL引擎时,会提示
IAL: Does not find the request engine
搜索一下minigui核心库的代码,发现在src/ial/ial.c的mg_InitIAL函数中有这样的语句:
if (__mg_cur_input == NULL) {
        fprintf (stderr, "IAL: Does not find the request engine: %s.\n", engine);
        if (NR_INPUTS) {
            __mg_cur_input = inputs;
            fprintf (stderr, "IAL: Use the first engine: %s\n", __mg_cur_input->id);
        }
        else
            return ERR_NO_MATCH;
}
向上找到
for (i = 0; i < NR_INPUTS; i++) {
        if (strncmp (engine, inputs.id, LEN_ENGINE_NAME) == 0) {
            __mg_cur_input = inputs + i;
            break;
        }
}
用inputs.id和engine比较,再发现本文件中有inputs的定义
static INPUT inputs [] =
{
/* General IAL engines ... */
#ifdef _MGIAL_QVFB
    {"qvfb", InitQVFBInput, TermQVFBInput},
#endif
。。。
#ifdef _MGIAL_TSLIB
    {"tslib", InitTSLibInput, TermTSLibInput},
#endif
。。。
};

找到了,只有在_MGIAL_TSLIB被定义的时候才会有{"tslib", InitTSLibInput, TermTSLibInput},
后面两个是其相关的初始化、处理函数。
如果没有定义_MGIAL_TSLIB这个,在/usr/local/etc/MiniguiCFG里面的
ial_engine=tslib后面写了tslib也匹配不了。
那么,搜索一下在哪里定义_MGIAL_TSLIB

  1. [/color][/size][/font][/i][/i][/size][/color][/i][/i][i][i][color=#000][size=12px][i][i][font=Verdana][size=2][color=#444444][root: libminigui-gpl-3.0.12]# grep "_MGIAL_TSLIB" ./ -nrw
  2. ./configure.in:1839:    AC_DEFINE(_MGIAL_TSLIB, 1,
  3. ./mgconfig.h:538:#define _MGIAL_TSLIB 1
  4. ./confdefs.h:67:#define _MGIAL_TSLIB 1
  5. ./mgconfig.h.in:537:#undef _MGIAL_TSLIB
  6. ./config.status:940:D["_MGIAL_TSLIB"]=" 1"
  7. ./configure:13143:$as_echo "#define _MGIAL_TSLIB 1" >>confdefs.h
  8. ./src/ial/ial.c:72:#ifdef _MGIAL_TSLIB
  9. ./src/ial/ial.c:151:#ifdef _MGIAL_TSLIB
  10. ./src/ial/tslibial.c:15:#ifdef _MGIAL_TSLIB
  11. ./src/ial/tslibial.c:147:#endif /* _MGIAL_TSLIB */
  12. 注意到
  13. ./configure:13143:$as_echo "#define _MGIAL_TSLIB 1" >>confdefs.h[/color][/size][/font][/i][/i][/size][/color][/i][/i]
  14. [i][i][color=#000][size=12px][i][i][font=Verdana][size=2][color=#444444]
复制代码

猜测为当某个条件满足的时候就会将#define _MGIAL_TSLIB 1写到confdefs.h中。
查看一下./configure --help,发现了
--enable-tslibial        build the IAL engine for TSLIB
那么配置的时候加上这个选项就OK了。


网盘下载地址:

#
zlib-1.2.6.tar.gz
#
jpegsrc.v8c.tar.gz
#
freetype-1_3_1.tar.gz
#
libpng-1.0.59.tar.gz
#
libminigui-gpl-3_0_12.tar.gz
#
mg-samples-3_0_12.tar.gz
#

minigui-res-be-3_0_12.tar.gz


2012-05-18 00:39 发表于百度空间,今搬至CU。

阅读(13084) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~