U​b​u​n​t​u​下​M​i​n​i​G​U​I​3​.​0​.​1​2​安​装​与​移​植

时间:2022-09-28 16:13:44

【软件环境】

PC:ubuntu  10.04
开发板:Linux  2.6.32.2@2440
Target:  arm-none-linux-gnueabi
gcc  version  4.4.3

下载相关的文件,地址:http://www.minigui.org/zhcn/download/

libminigui-gpl-3_0_12.tar.gz
mg-samples-3_0_12.tar.gz
freetype-1_3_1.tar.gz
jpegsrc_v7.tar.gz  
libpng-1_2_37.tar.gz
minigui-res-be-3_0_12.tar.gz
zlib-1_2_2.tar.gz
qvfb2-2.0

安装QVFB或GVFB,QVFB的安装在这里:http://www.cnblogs.com/sankye/archive/2012/10/29/2745332.html

安装qvfb2
(因为需要qt-3.3作支持,所以需要先安libqt3-mt,libqt3-mt-dev,下载qt-devel-3.3.8-4.fc7.i386.rpm,然后用alien转为deb,再用dpkg -i --force-overwrite 来安装此包)
sudo apt-get install libqt3-mt
sudo apt-get install libqt3-mt-dev
sudo apt-get install alien
sudo alien qt-devel-3.3.8-4.fc7.i386.rpm
dpkg -i --force-overwrite qt-devel-3.3.8-4.fc7.i386.deb
(开始安qvfb)
cd qvfb2-2.0
./configure --with-qt-includes=/usr/lib/qt-3.3/include --with-qt-libraries=/usr/lib/qt-3.3/lib --with-qt-dir=/usr/lib/qt-3.3
sudo make
sudo make install
(qvfb2与1不同,没有文件输入是不会显示出框图的)

MINIGUI3.0默认是GVFB的配置,我直接装的GVFB:

   (a)通过apt-get安装:libgtk2.0-dev

   (b)解压gvfb-1_0_0.tar.gz

   (c)切换到gvfb-1_0_0目录

   (d)运行以下命令:

    cmake ./
            sudo make
            sudo make install

编译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
[root: libminigui-gpl-3.0.12]# grep "_MGIAL_TSLIB" ./ -nrw
    1. ./configure.in:1839:    AC_DEFINE(_MGIAL_TSLIB, 1,
    2. ./mgconfig.h:538:#define _MGIAL_TSLIB 1
    3. ./confdefs.h:67:#define _MGIAL_TSLIB 1
    4. ./mgconfig.h.in:537:#undef _MGIAL_TSLIB
    5. ./config.status:940:D["_MGIAL_TSLIB"]=" 1"
    6. ./configure:13143:$as_echo "#define _MGIAL_TSLIB 1" >>confdefs.h
    7. ./src/ial/ial.c:72:#ifdef _MGIAL_TSLIB
    8. ./src/ial/ial.c:151:#ifdef _MGIAL_TSLIB
    9. ./src/ial/tslibial.c:15:#ifdef _MGIAL_TSLIB
    10. ./src/ial/tslibial.c:147:#endif /* _MGIAL_TSLIB */
    11. 注意到
    12. ./configure:13143:$as_echo "#define _MGIAL_TSLIB 1" >>confdefs.h

  1. 注意到
  2. ./configure:13143:$as_echo "#define _MGIAL_TSLIB 1" >>confdefs.h

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


8.编译示例代码ctrl_dlg

自己写了个makefile

 

CC=arm-softfloat-linux-gnu-gcc

CPP=arm-softfloat-linux-gnu-gcc

ac_ct_CC=arm-softfloat-linux-gnu-gcc

LIBS=/usr/local/minigui/lib

#MINIGUI_CFLAGS=/usr/local/minigui/include       error:cant create executables

#CPPFLAGS=/usr/local/minigui/include

#MINIGUI_LIBS=/usr/local/minigui/lib

MINIGUI_CFLAGS=-I/usr/local/minigui/include

CPPFLAGS=-I/usr/local/minigui/include

MINIGUI_LIBS=-L/usr/local/minigui/lib -lminigui_ths -ljpeg -ldl -lm -lpthread

 

#-lpng

ctrl_dlg_inc=ctrls.h  dlgdemo.h  dlgdemo_res_cn.h  dlgdemo_res_en.h  dlgdemo_res_tw.h  resouce.h

ctrl_dlg_obj=dlgdemo.o dlgres.o psdemo.o subclass.o \

        static.o button.o edit.o listbox.o combobox.o \

              menubutton.o toolbar.o trackbar.o progbar.o \

        monthcalendar.o treeview.o listview.o coolbar.o \

              timeedit.o newtoolbar.o

 

ctrl_dlg:$(ctrl_dlg_obj)

       $(CC) -o ctrl_dlg $(CPPFLAGS) $(MINIGUI_LIBS) $(ctrl_dlg_obj)

 

dlgdemo.o:dlgdemo.c $(ctrl_dlg_inc)

dlgres.o:dlgres.c $(ctrl_dlg_inc)

psdemo.o:psdemo.c $(ctrl_dlg_inc)

subclass.o:subclass.c $(ctrl_dlg_inc)

static.o: static.c $(ctrl_dlg_inc)

button.o:button.c $(ctrl_dlg_inc)

edit.o:edit.c $(ctrl_dlg_inc)

listbox.o:listbox.c $(ctrl_dlg_inc)

combobox.o:combobox.c $(ctrl_dlg_inc)

menubutton.o:menubutton.c $(ctrl_dlg_inc)

toolbar.o:toolbar.c $(ctrl_dlg_inc)

trackbar.o:trackbar.c $(ctrl_dlg_inc)

progbar.o:progbar.c $(ctrl_dlg_inc)

monthcalendar.o:monthcalendar.c $(ctrl_dlg_inc)

treeview.o:treeview.c $(ctrl_dlg_inc)

listview.o:listview.c $(ctrl_dlg_inc)

coolbar.o:coolbar.c $(ctrl_dlg_inc)

timeedit.o:timeedit.c $(ctrl_dlg_inc)

newtoolbar.o:newtoolbar.c $(ctrl_dlg_inc)

#grid.o:grid.c $(ctrl_dlg_inc)

 .PHONY : clean

clean :

       rm ctlr_dlg $(ctrl_dlg_obj)