【软件环境】
开发板: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
-
- ./configure.in:1839: AC_DEFINE(_MGIAL_TSLIB, 1,
- ./mgconfig.h:538:#define _MGIAL_TSLIB 1
- ./confdefs.h:67:#define _MGIAL_TSLIB 1
- ./mgconfig.h.in:537:#undef _MGIAL_TSLIB
- ./config.status:940:D["_MGIAL_TSLIB"]=" 1"
- ./configure:13143:$as_echo "#define _MGIAL_TSLIB 1" >>confdefs.h
- ./src/ial/ial.c:72:#ifdef _MGIAL_TSLIB
- ./src/ial/ial.c:151:#ifdef _MGIAL_TSLIB
- ./src/ial/tslibial.c:15:#ifdef _MGIAL_TSLIB
- ./src/ial/tslibial.c:147:#endif /* _MGIAL_TSLIB */
- 注意到
- ./configure:13143:$as_echo "#define _MGIAL_TSLIB 1" >>confdefs.h
- ./configure.in:1839: AC_DEFINE(_MGIAL_TSLIB, 1,
- 注意到
- ./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)