采用交叉编译方式
【软件环境】
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
-
[/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
-
./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[/color][/size][/font][/i][/i][/size][/color][/i][/i]
-
[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。
阅读(13165) | 评论(0) | 转发(0) |