MiniGUI-1.6.10在S3C2440上的移植
一、编译前准备
1、硬件环境
(1)x86系列PC机
(2)带有S3C2440核心板的开发板
(3)液晶显示器,VGA接口线,串口和USB线,网线
2.软件环境
(1)主机操作系统
VMware虚拟机下的ubuntu10.10。
(2)开发板操作系统
嵌入式Linux,内核版本为2.6.37。
(3)交叉编译器
arm-linux-gcc-3.4.1
安装位置:/home/bhj/tools/(安装目录可任选,注意与上下文保持一致)。
3.相关说明
(1)命令
所有以#开头的均为在shell中执行的命令。
(2)交叉编译器位置
交叉编译器的安装位置为/home/bhj/tools/,进行交叉
编译产生的库都安装在/home/bhj/tools/arm/3.4.1/arm-linux/lib/目录下,可以根据你的交叉编译器的实际位置进行更改。
(3)工作目录
默认的工作目录为/root/minigui/,绝大多数操作都在此目录下进行。
4.下载MiniGUI图形库源码(已提供)
开发库目录MiniGUI-1.6.10,目录中包含games-1.6.10.tar.gz,mde-1.6.10.tar.gz,minigui-res-1.6.10.tar.gz,libminigui-1.6.10.tar.gz,mg-samples-1.6.10.tar.gz,共5个库。
(1)libminigui-1.6.10中包含3个库:
libminigui是提供窗口管理和图形接口的核心函数库,也提供了大量的标准控件;
libmgext 是libminigui的一个扩展库,提供了一些高级控件以及“文件打开”、“颜 {MOD}选择”对话框等;
libvcongui 则为Linux操作系统提供了一个应用程序可用的虚拟控制台窗口,从而可以方便地在MiniGUI环境中运行字符界面的应用程序。
(2)资源文件minigui-res-1.6.10.tar.gz
MiniGUI所使用的资源,包括基本字体、图标、位图和鼠标光标。
(3)示例程序mg-samples-str-1.6.10.tar.gz
《MiniGUI编程指南》的配套示例程序。
(4)综合演示程序mde-1.6.10.tar.gz
MiniGUI的综合演示程序包,其中包含有一些较为复杂的示例程序。
5.下载所依赖函数库源码(已提供)
(1)zlib库
zlib-1.2.3.tar.gz,这是编译后面的库的基础。
(2)png库
libpng-1.0.10rc1.tar.gz
(3)jpeg库
jpegsrc.v6b.tar.gz,jpeg图片支持库。
(4)ttf库
freetype-1.3.1.tar.gz,TrueType字体的支持库。
(5)popt库
popt-1.7.tar.gz,编译mde需要。
6.下载上位机仿真程序(已提供)
Qt虚拟缓冲帧qvfb-1.1.tar.gz.rar,上位机仿真需要。
7.复制根文件系统
复制开发板上自带的根文件系统root_qtopia.tar.gz到虚拟机中,并把yaffs映像制作工具mkyaffs2image复制到/bin/目录下。
8.解压源码包
(1)建立工作目录并复制源码包
#mkdir /root/minigui
(创建工作目录,绝大部分相关的操作抖将在此目录下进行)
#mkdir /root/minigui/source
(创建source目录,所有的源码包都放在此目录)
#cp……… /root/minigui/source
(把所有下载的源码包(qvfb-1.1.tar.gz.rar, MiniGUI-1.6.10.rar, MiniGUI-1.6.10依赖库.rar)复制到此目录)
#mkdir /root/minigui/arm
(创建arm目录,所有进行交叉编译所需的源码都放在此目录)
#mkdir /root/minigui/x86(如不需仿真,可不做)
(创建x86目录,所有进行仿真所需的源码都放在此目录)
(2)解压上位机仿真所需源码(如不需仿真,可不做)
#cd /root/minigui/source/MiniGUI-1.6.10
(进入开发库源码包所在目录)
#tar zxvf libminigui-1.6.10.tar.gz -C ../../x86
(解压MiniGUI图形库源码到x86目录,-C选项的含义是更改解压缩目录)
#tar zxvf minigui-res-1.6.10.tar.gz -C ../x86
(解压MiniGUI资源文件到x86目录)
#tar zxvf mg-samples-1.6.10.tar.gz -C ../../x86
(解压MiniGUI示例源码到x86目录)
#tar zxvf mde-1.6.10.tar.gz –C ../../x86
(解压MiniGUI综合演示源码到x86目录)
#tar zxvf qvfb-1.1.tar.gz –C ../../x86
(解压qvfb源码到x86目录)
(3)解压交叉编译所需源码
#cd/root/minigui/source/MiniGUI-1.6.10
(进入开发库源码包所在目录)
#ta zxvf libminigui-1.6.10.tar.gz –C ../../arm
(解压MiniGUI图形库源码到arm目录)
#tar zxvf minigui-res-1.6.10.tar.gz –C ../../arm
(解压MiniGUI资源文件到arm目录)
#tar zxvf mg-samples-1.6.10.tar.gz –C ../../arm
(解压MiniGUI示例源码到arm目录)
#tar zxvf mde-1.6.10.tar.gz –C ../../arm
(解压MiniGUI综合演示源码到arm目录)
#cd /root/minigui/source/MiniGUI-1.6.10依赖库
(进入依赖库源码包所在目录)
#tar zxvf zlib-1.2.3.tar.gz –C ../../arm
(解压zlib源码到arm目录)
#tar zxvf libpng-1.0.10rc1.tar.gz –C ../../arm
(解压png源码到arm目录)
#tar zxvf jpegsrc.v6b.tar.gz –C ../../arm
(解压jpeg源码到arm目录)
#tar zxvf popt-1.7.tar.gz –C ../../arm
(解压popt源码到arm目录)
(4)解压根文件系统
#tar zxvf root_qtopia.tar.gz -C ../../arm
(解压根文件系统root_qtopia到arm目录)
二、建立仿真开发环境
1.安装minigui-res-1.6.10
#cd /root/minigui/x86/minigui-res-1.6.10
#make install
这样MiniGUI运行时所需的资源文件就被安装到/usr/local/lib/minigui/res/目录下。
2.编译libminigui-1.6.10
#cd /root/minigui/x86/libminigui-1.6.10
#./configure
#make
#make install
库文件被安装到系统中。
3.编译mg-samples-1.6.10
#cd /root/minigui/x86/mg-samples-1.6.10
#./configure
#make
在src目录下可以看到生成的可执行程序。
4.编译mde-1.6.10(此步未编译通过)
#cd /root/minigui/x86/mde-1.6.10
#./configure
#make
(先会提示vcongui.c文件中找不到popt.h,然后我找到popt.h,将它放到tools/目录下,再make,会出现这个错误:gcc
-g -O2 -Wall -Wstrict-prototypes -pipe -D_REENTRANT -o vcongui vcongui.o -lvcongui -lmgext -lpopt -lpthread -lminigui -lm
/usr/bin/ld: cannot find -lpopt,原因是没有提供popt的仿真库)
如果编译成功的话,在各个子目录里可以看到相应的可执行演示程序。
5.编译qvfb-1.1(如不需仿真,可不做)
#cd /root/minigui/x86/qvfb-1.1
#./configure
(如果此处出现:
错误: Can't find X includes. Please check your installation and add the correct paths!
原因:没有X的包含文件
解决:sudo aptitude install libx11-dev xorg-dev
其余错误见:http://wenku.baidu.com/view/0e839c681eb91a37f1115cc3.html)
#make
在qvfb子目录下可以看到可执行的qvfb程序,复制到系统目录即可运行。如果在先前按照mini2440的用户手册搭建过Qt/Embedded开发环境,可能无法编译成功,主要是因为修改了/etc/ld.so.config文件。最简单的方法就是把搭建Qt/Embedded开发环境时生成的qvfb复制到/bin目录,直接就可以运行。“编译qvfb-1.1”这一步就可以省略掉了。
6.在上位机上仿真MiniGUI应用程序(如不需仿真,可不做)
#qvfb–width640–height480&
(由于前面把qvfb复制到了/bin目录,所以可以直接运行。后面的参数制定了qvfb的显示尺寸,因为在MiniGUI.cfg里qvfb的尺寸默认为640*480,所以如果不指定这个值会无法运行,&选项指名这个程序在后台执行)
#cd /root/minigui/x86/mg-samples-1.6.10/src
#./helloworld
如果一切顺利的话现在就可以在qvfb上面看到MiniGUI
的界面了。还有mde子目录里面的程序,也可以直接执行。
三、交叉编译图形库
1.编译zlib库
由于zlib库的configure脚本不支持交叉编译选项,所以我们只好使用符号链接把gcc指向我们的交叉编译器arm-linux-gcc,在编译完后再改回来即可。
(1)把gcc指向我们的交叉编译器arm-linux-gcc
#cd usr/bin
#mv gcc gcc_bak
(备份gcc)
#ln -s /home/bhj/tools/arm/3.4.1/bin/arm-linux-gcc ./gcc
(创建gcc到arm-linux-gcc的符号连接)
#mv ld ld_bak
(备份ld)
#ln -s /home/bhj/tools/arm/3.4.1/bin/arm-linux-ld ./ld
(创建ld到arm-linux-ld的符号连接)
(2)交叉编译zlib库
#cd /root/minigui/arm/zlib-1.2.3
#./configure --prefix=/home/bhj/tools/arm/3.4.1/arm-linux/ --shared
(prefix选项把zlib库安装在/home/bhj/tools/arm/3.4.1/arm-linux/)
(shared说明生成共享库)
#make
#make install
(3)改回gcc
#cd /usr/bin
#rm gcc
(删除gcc到arm-linux-gcc的符号连接)
#mv gcc_bak gcc
(还原gcc)
#rm ld
(删除ld到arm-linux-ld的符号连接)
#mv ld_bak ld
(还原ld)
2.编译png库
这个是用来显示png图形的,MiniGUI里很多图都是png的,如果没有这个库,你的MiniGUI将无法正常工作。由于libpng不提供有效的configure脚本,所以只好自己动手改写Makefile文件了。
(1)改写Makefile
#cd /root/minigui/arm/libpng-1.0.10rc1
#cp scripts/makefile.linux Makefile
(把scripts目录下的一个Makefile拷出来自己动手改)
#vi Makefile
(自己动手改Makefile)
CC=arm-linux-gcc
prefix=/home/bhj/tools/arm/3.4.1/arm-linux
ZLIBLIB=/home/bhj/tools/arm/3.4.1/arm-linux/lib
ZLIBINC=/home/bhj/tools/arm/3.4.1/arm-linux/include
(保存)
(2)编译安装
# make
# make install
3.编译jpeg库
由于jpeg库的configure文件设计的有问题,得先用gcc编译一个dummy.c的文件,然后才能后面编译,不然的话就会出现libtool找不到之类的错误。所以先本机编译,然后清
除后,最后交叉编译即可解决这个问题。
(1)本机编译jpeg库
#cd /root/minigui/arm/jpeg-6b
#./configure --enable-shared --enable-static
#make
#make clean
(2)交叉编译jpeg库
#./configure --prefix=/home/bhj/tools/arm/3.4.1/arm-linux/
CC=arm-linux-gcc --enable-shared --enable-static
#make
#mkdir –p /home/bhj/tools/arm/3.4.1/arm-linux/man/man1
(安装前需要在arm-linux下建个目录,不然安装会出错)
#make install
4.编译popt
#cd/root/minigui/arm/popt-1.7
#./configure
--prefix=/home/bhj/tools/arm/3.4.1/arm-linux/
--host=arm-linux --enable-shared --enable-static
(此处如果报错:
checking for GNU xgettext... configure: error:
*** GNU gettext is required. The latest version
*** is always available from ftp://ftp.gnu.org/gnu/gettext/.
解决方法:
sudo apt-get install gettext ,安装后再重复此步)
#make
#make install
5.编译libttf库
libttf 库是TrueType字体的支持库,当然可以支持也可以不支持,这个库只能全手动安装和编译,先建立一个目录来存放其有用的或者说是我们所用到的库的源文件。
(1)复制源文件
#mkdir -p/root/minigui/arm/libttf/extend
#cd /root/minigui/arm/
#cp freetype-1.3.1/lib/* freetype-1.3.1/lib/arch/ansi/* /root/minigui/arm/libttf/
#cp freetype-1.3.1/lib/extend/* /root/minigui/arm/libttf/extend/
(2)交叉编译
#cd /root/minigui/arm/libttf
#arm-linux-gcc –c –fPIC -O2 freetype.c
(这个freetype.c中包括了其它所有的.c文件)
#arm-linux-gcc -c -fPIC -O2 -I./ extend/*.c
(把extend下所有的.c文件全部编译)
#arm-linux-gcc -shared -o libttf.so *.o
(生成最后的动态链接库)
#cp libttf.so /home/bhj/tools/arm/3.4.1/arm-linux/lib
6.编译libminigui
#cd/root/minigui/arm/libminigui-1.6.10
#./configure
--prefix=/root/minigui/arm/target
--host=arm-linux
--target=arm-linux
--build=i386-linux
--with-osname=linux
--with-style=classic
--with-targetname=fbcon
--enable-autoial
--enable-rbf16
--disable-vbfsupport
CC=arm-linux-gcc
#make
#make install
(这样就会把交叉编译好的库文件和头文件安装在/root/minigui/arm/target目录)
#cp /root/minigui/arm/target/lib/* /home/bhj/tools/arm/3.4.1/arm-linux/lib/
#cp -r /root/minigui/arm/target/include/* /home/bhj/tools/arm/3.4.1/arm-linux/include/
(把交叉编译好的库文件和头文件复制到交叉编译器中,便于使用)
7.编译mg-samples
(1)cd /root/minigui/arm/mg-samples-1.6.10/
修改configure.in第30行,这一步有没有用说不清楚,改成下面的样子
AC_CHECK_HEADERS($prefix/include/minigui/common.h, have_libminigui=”no”, foo="bar")
(2)修改configure配置文件,在文件的最前面加上交叉编译的工具
CC=arm-linux-gcc
CPP=arm-linux-cpp
LD=arm-linux-ld
AR=arm-linux-ar
RANLIB=arm-linux-ranlib
STRIP=arm-linux-strip
(3)配置
#./configure --prefix=/root/minigui/arm/target/
--host=arm-linux
--target=arm-linux
(--prefix所指定的目录必须与编译libminigui时所指定的目录一致)
(4)修改src/Makefile
CC = arm-linux-gcc -I/root/minigui/arm/target/include -L/root/minigui/arm/target/lib
CFLAGS =-O2
LIBOBJS = -lminigui -lmgext -lm -lpthread -lpng -ljpeg
LIBS = -lminigui -lmgext -lm -lpthreada -lpng -ljpeg
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS)
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -lminigui -lmgext -lm -lpthread -lpng -ljpeg
(5)编译
#make
8.编译mde
(1)cd /root/minigui/arm/mde-1.6.10/
修改configure.in第30行,这一步有没有用说不清楚,改成下面的样子
AC_CHECK_HEADERS($prefix/include/minigui/common.h, have_libminigui=”no”, foo="bar")
(2)修改configure配置文件,在文件的最前面加上交叉编译的工具
CC=arm-linux-gcc
CPP=arm-linux-cpp
LD=arm-linux-ld
AR=arm-linux-ar
RANLIB=arm-linux-ranlib
STRIP=arm-linux-strip
(3)配置
#./configure --prefix=/root/minigui/arm/target/
--host=arm-linux
--target=arm-linux
(--prefix所指定的目录必须与编译libminigui时所指定的目录一致)
(4)编译
#make
四、部署图形库
1.复制MiniGUI图形库到根文件系统
#cp /root/minigui/arm/target/lib/* /root/minigui/arm/root_qtopia/lib
2.复制依赖库到根文件系统
#cp /home/bhj/tools/arm/3.4.1/arm-linux/lib/libjpeg* /root/minigui/arm/root_qtopia/lib
#cp /home/bhj/tools/arm/3.4.1/arm-linux/lib/libm* /root/minigui/arm/root_qtopia/lib
#cp /home/bhj/tools/arm/3.4.1/arm-linux/lib/libpng* /root/minigui/arm/root_qtopia/lib
#cp /home/bhj/tools/arm/3.4.1/arm-linux/lib/libpopt* /root/minigui/arm/root_qtopia/lib
#cp /home/bhj/tools/arm/3.4.1/arm-linux/lib/libttf* /root/minigui/arm/root_qtopia/lib
#cp /home/bhj/tools/arm/3.4.1/arm-linux/lib/libz* /root/minigui/arm/root_qtopia/lib
3.缓存函数库
#cd /root/minigui/arm/root_qtopia/etc
#vi ld.so.cfg(若没有,就新建一个)
(添加)
/usr/local/lib
/usr/lib
/lib
(保存)
#ldconfig -r /root/minigui/arm/root_qtopia
如果不这样做,在开发板上运行MiniGUI应用程序时可能会出现找不到库的情况。
4.复制资源文件
#mkdir -p /root/minigui/arm/root_qtopia/usr/local/lib/minigui
#cp -r /usr/local/lib/minigui/res /root/minigui/arm/root_qtopia/usr/local/lib/minigui
(MiniGUI应用程序在运行时可能会用到的一些位图,光标等资源文件。)
5.复制MiniGUI.cfg到根文件系统
#mkdir /root/minigui/arm/root_qtopia/usr/local/etc
#cp /root/minigui/arm/target/etc/MiniGUI.cfg /root/minigui/arm/root_qtopia/usr/local/etc
(这是MiniGUI运行时配置文件,在MiniGUI应用程序运行时会用到。)
6.修改配置文件
#cd /root/minigui/arm/root_qtopia/usr/local/etc
#vi MiniGUI.cfg
(修改)
[system]
gal_engine=fbcon
(设置图形引擎为帧缓冲控制台fbcon)
ial_engine=cosole
(设置输入引擎为控制台)
mdev=/dev/mice
(设置鼠标输入设备,此处应根据具体情况修改,先查看自己的根文件系统的/dev/目录中鼠标设备的名称,再进行修改,我的mice在/dev/目录下,所以要修改为mdev=/dev/mice,否则会提示mouse初始化错误)
mtype=IMPS2
(设置输入法,若设置为mtype=none,则表示不使用鼠标)
[fbcon]
defaultmode=1024x768-16bpp
(设置fbcon显示参数,可根据实际情况进行修改)
此文件中还有一些其他的配置信息,可根据实际情况进行删改。
(保存)
7.修改启动脚本
#cd /root/minigui/arm/root_qtopia/etc/init.d
#vi rcS
(在最后添加如下内容)
/bin/ln -s/dev/vc/0 /dev/tty0
(保存)
否则会出现如下问题:
NEWGAL>FBCON:Can'topen/dev/tty0:No such file or directory
NEWGAL:Set video mode failure.
InitGUI:Can not initialize graphics engine!
8.制作根文件系统
#cd/root/minigui/arm
#mkyaffsimage root_qtopia/ root_minigui.bin(自由命名,也可生成.img格式)
9.下载并执行MiniGUI应用程序
把上面制作好的根文件系统下载并烧写到开发板上,执行可执行文件(如 ./helloworld)。
10. 编写一个自己的MiniGUI应用程序-----helloworld
#cd /root/minigui/arm
#mkdir helloworld
#cd helloworld
#cp ../mg-samples-1.6.10/src/helloworld.c ./
(复制helloworld源文件)
#vi Makefile
(编写Makefile,添加内容如下:)
TARGET=helloworld
CROSS_PATH=/home/bhj/tools/arm/3.4.1/arm-linux
(指定交叉编译函数库的位置)
helloworld:$(TARGET).c
arm-linux-gcc -o $(TARGET) $(TARGET).c
-L$(CROSS_PATH)/lib
-I$(CROSS_PATH)/include
-lminigui -lmgext -lm -lpthread -lpng -ljpeg
(-L选项后添加库文件路径,-I选项后添加头文件搜索路径,
后面的-lpng -lminigui -lz -lpthread分别指名了编译时所依赖的函数库,如果使用了MiniGUI的扩展功能,还要添加-lmgext)
clean:
rm $(TARGET) $(TARGET)*.o -rf
(保存)
#make
把生成的helloworld下载到开发板上执行,会发现和前面的结果一样,这里只是为了说明如何编译自己编写的应用程序。
ps:此文档由网上搜集资料和个人实际操作后总结整理而出,十分感谢那些无私奉献的网友。但个人觉得不够完善和全面,特总结至此,希望对大家有所帮助。
出于学习目的,本文档可以任意复制,修改和转载。但大家希望能保留引用。其中可能还有不少错误,欢迎批评指正!