想好好学学编程基础,先前安装了qt的开发环境,但是最终因为c++水平有限,决定先搞搞minigui的代码,就按着这个教材安装了个开发环境
花了我一晚上的时间
Minigui 算是我们中国人在世界软件界的骄傲了,作为中国人理应学它,虽然现在基本都用 QT 了。(关键是我的开发板只有 16M 的 NORFLASH ,华恒的板子真会赚钱,故意留个 NANDFLASH 不给你焊接上去,唉这么小的 ROM 只能望 QT 兴叹了)不过 MiniGUI 做的不错,玩了玩他们自带的扫雷啥的小游戏,还挺爽的。
华恒的 S3C2440 的光盘里面已经讲交叉编译环境下的 Minigui 给你做的七七八八了。下面是华恒的交叉编译环境的搭建步骤 :
A .编译 minigui 库 (在 libminigui-1.3.3 目录下操作)
B .编译 minigui 支持资源 (在 minigui-res-1.3.3 目录下操作)
C .编译 minigui 的示例程序 (在 mg-samples-1.3.1 和 mde-1.3.0 目录下操作)
D. 以上步骤编译出来的文件放到文件系统映像( ramdisk.image.gz )文件去
为了方便,我们上述目录和 nfsroot 目录都放入一个 HHTECH 字母打头脚本文件,执行相应脚本文件,就可以完成一系列的操作, 可以使用 vi 打开相关文件看看,所做的操作将在下面介绍移植过程作出介绍。
A. 在 libminigui-1.3.3 目录下编写了 HHTECH.inst.lib 脚本文件,执行此文件就可以把 mingui 的库、包含文件等文件编译好,以便后面操作。
B. 在 mingui-res-1.3.3 目录下编写了 HHTECH.inst 脚本文件,执行此文件,就可以把运行 minigui 示例程序时需要的相关资源拷贝到 /HHARM2440/applications/minigui-free/nfsroot 目录的相关目录下去。
C. 在 mg-samples-1.3.1 和 mde-1.3.0 目录下编写了 HHTECH.compile.mg 脚本文件 , 执行此文件,在 mg-samples-1.3.1/src 和 mde-1.3.0/bomb 目录及其它目录下就可以生成 minigui 的示例, mg-samples 目录下是一些简单的示例, mde-1.3.1 目录下是复杂一些的示例或应用程序。这些应用程序需要客户可以自行选择哪些拷贝到文件系统( ramdisk.imag.gz )中去。我们已经拷贝了 mg-samples-1.3.1/src/ 目录下的 treeview 到我们带的文件系统映像文件
不是用的华恒的板子的兄弟们也不用急,因为华恒只给了交叉编译环境的,为了开发方便,我们换需要搭建在 PC 环境下的 Minigui 。具体的移植搭建方法完全一样,只是用的编译工具不同,一个是 gcc 一个是 arm-linux-gcc 。
为了与交叉编译环境兼容,我选择了 minigui1.3.3 版本
那么开始移植吧:
1. 安装 Minigui
1 )首先下载 Minigui 的软件:
http://www.minigui.com/download/libminigui-1.3.3.tar.gz
Minigui 的库文件
http://www.minigui.com/download/minigui-res-1.3.3.tar.gz
minigui 所使用的资源,包括基本字体、图标、位图和鼠标光标
这两个包的下载需要你在www.minigui.com 上注册过才可以下载,免费注册的,自己去下吧
http://www.minigui.com/downloads/minigui13/mde-1.3.0.tar.gz 图形界面程序
http://www.minigui.com/downloads/minigui13/mg-samples-1.3.0.tar.gz
一些小例子
2 )下载支持的库文件
这里注意的是查看你的 linux 里面有没有 jpeg , png , ttf , lz 这些库文件
可以利用解压缩 libminigui-1.3.3 下的 configture 进行验证:
# tar zxf libminigui-1.3.3.tar.gz
# cd libminigui-1.3.3
# ./configure
注意看 configure 的信息,如果有:
checking for FrameBuffer console support... yes
checking for pthread library... yes
checking for TT_FreeType_Version in -lttf... yes
checking for jpeg_std_error in -ljpeg... yes
checking for png_check_sig in -lpng... yes
如果里面有“ no ”的话,不用编译了,先把相关的库装起来在编译 libminigui 。由于我的什么库都没有因此都要安装,下面详细介绍:
A :首先安装 zlib 库,这个是后面的库的编译基础。
http://www.zlib.net/zlib-1.2.3.tar.gz
400 多 K ,去下载吧,
保存到一个目录下后 ( 如 /minigui)
# tar zxf zlib-1.2.3.tar.gz
# cd / zlib-1.2.3
# ./configure --shared 编译成动态库
# make
# make install 安装
B :安装 png 库
# tar zxf libpng-1.0.10rc1.tar.gz
# cd libpng-1.0.10rc1
Libpng 不提供有效的 configure 脚本,所以只好自己动手改 Makefile 文件了。可以把 Scripts 下的一个 makefile 拷出来自己动手改
# cp scripts/makefile.linux Makefile
# make
# make install
C :安装 libjpeg-6b
tar xzvf jpegsrc.v6b.tar.gz
cd jpeg-6b
. /configure --enable-static --enable-shared --prefix=/usr // 关键这样才能生成要求的库文件
make
mkdir /usr/man/man1 // 必须件这个文件夹否则安装出错
make install
D :安装 ttf
这个比较麻烦一点。
# tar zxf freetype-1.3.1.tar.gz // 老一套
# cd freetype-1.3.1 // 进到目录里去
# mkdir – p /opt/ libttf/extend // 自己另外建立一个目录
# cp freetype-1.3.1/lib/* freetype-1.3.1/lib/arch/ansi/* libttf/ // 把有用的东西拷出来
#cp freetype-1.3.1/lib/extend/* libttf/extend/ 把 extend 目录下的文件也拷出来
就是拷贝到自建的目录 /opt/ libttf/
注意 cp 命令不要用 – r 选项,因为会把一些没用的东西出拷出来的
拷贝完成了,现在来自己手动编译了
# cd libttf
# gcc -c -fPIC -O2 freetype.c // 不要奇怪,对,我们只要编译这一个 .c 文
// 因为它包括了其它所有的 .c 文件了,你可以自己查看它的内容
# gcc -c -fPIC -O2 -I./ extend/*.c 把 extend 下所有的 .c 文件全部编译
# gcc --shared -o libttf.so *.o 生成最后的动态链接库, OK 了
把编译好的东东拷贝到系统路径
mkdir –p /usr/local/ include/freetype1/freetype
cp *.h extend/*.h /usr/local/ include/freetype1/freetype
cp libttf.so /usr/local /lib
安装库完成,哈!
3 )编译 libminigui-1.3.3
# tar zxf libminigui-1.3.3.tar.gz
# cd libminigui-1.3.3
# ./configure // 这是应该全是 yes
# make
# make install
4 )编译安装 minigui-res-1.3.3 // 不会有问题的
# tar zxf minigui-res-1.3.3
# cd minigui-res-1.3.3
# ./configure
# make
# make install
5 )最后,安装 popt 库,这个库在编译 mde 程序时需要使用,不然编译没法通过 : http://gd.tuwien.ac.at/utils/rpm.org/dist/rpm-4.1.x/popt-1.7.tar.gz
# tar zxf popt-1.7.tar.gz
# cd popt-1.7
# ./configure --enable-shared --enable-static
# make
# make install
6 )激活 FramebeBuffer
这里很重要:
# cd /boot/grub
# vim menu.list
grub.conf 其实是 grub 引导程序 menu.lst 符号连接文件指向的引导菜单 , 再其中加
title MiniGUI FrameBuffer
root (hd0,0)
kernel /boot/vmlinuz-2.4.20-8 ro root="LABEL/" vga="0x0314" fb:on
意思是引导标题 MiniGUI FrameFuffer 模式 root 所在第一 IDE 硬盘的第一分区做为引导分区 kernel 内核的路径在 /boot 下名为 vmlinuz-2.4.20-8 的文件, ro 是以只读方式挂接 root="LABEL/vga"=0x0314 意为使用 800*600 的分辩率,如要使用 640*480 分辩率自行改为 vga=0x0311 使用 1024*768 分辩率请改为 vga=0x0317 , 后面的 fb:on 是关键 , 它就是打开内核 FrameBuffer 显示模式的关键参数 , 重新启动后你就可以看到屏幕左上角可爱的小启鹅了。
6 )修改 MiniGUI.cfg
MiniGUI 有两种执行方式,一个是利用 qvfb 开启模拟环境,他需要 X 图形支持,由于我的 linux 没有安装这些库,他们的以来关系有太复杂所以我没有选,选择了另一种更简单的方式就是在 Console 下在 Framebuffer 上执行,这种方式也带来很多麻烦,后面介绍。
修改 /usr/local/etc/MiniGUI.cfg 文件,如下
[system]
# GAL engine
gal_engine=fbcon
// 这里修改
# IAL engine
ial_engine=console
// 这里修改
mdev=/dev/mouse
mtype=none // 这里改成 none ,因为经常鼠标不正常
[fbcon]
defaultmode=800x600-16bpp // 与前面的 vga=0x0314 匹配
[qvfb]
defaultmode=640x480-16bpp
display=0
重启动你的 RedHat 9 ,在出现 Grub 的时候按 E 键,在 kernel = … .. 这一行的最后加入 vga=0x314 ,然后 Enter ,然后在 kernel= … 这一行上按 b 就可以了,这时候可以在启动时看到一个小企鹅的图标, OK
7 )修改默认库路径
修改你的 /etc/ld.so.conf 文件,在里面最后新加入一行 /usr/local/lib
# ldconfig
8 )编译例程
还记得前面让你下载的 mg-samples-1.3.0.tar.gz 这个包吧,这个就是一些例子,现在试试吧:
# tar zxf mg-samples-1.3.0.tar.gz
# ./configure
# make
# cd src
看看 src 目录下是不是已经编译出可执行文件来了
8 )运行程序
前面说采用 fbcon] 的方法不好,就在这里体现了,我在这里被卡了很久。一切 Minigui 的程序都不能在图形界面下运行,否则会冲突早成花屏,好像没有很多人提出这个解决方法,搞的的卡了很久,也许他们都用 qvfb 模式了吧。
解决方法就是进入纯字符模式:
可以按 ctrl+Alt+F5( 用虚拟机的兄弟注意:先把虚拟机的 参数 - à 热键 改成 ctrl+Alt+Shift 否则会冲突,不响应 ) 。
在纯字符下我们可以运行刚才编译好的程序:
# cd …./mg-sample*
# cd /src
# ./helloworld
可以看到我们的程序跑起来。
另外回到图形界面可以使用指令:
# init 3 (进入字符界面是 # init5 )
来回的切换非常慢,中间还要输入用户名和密码,大家可以参考别人的博客,移植 qvfb 模式。更方便。
我用的是ubuntu,grub没搞明白,就搞搞qvfb
Minigui在PC端编译和qvfb编译
步骤一:安装libminigui-1.3.3
linux:/home/work/minigui # cd libminigui-1.3.3/
linux:/home/work/minigui/libminigui-1.3.3 # make menuconfig
将“Font options”中的“Var bitmap font”选项去掉,否则报报下面错误一
linux:/home/work/minigui/libminigui-1.3.3 # make
linux:/home/work/minigui/libminigui-1.3.3 # make install
默认配置下将安装到/usr/local/目录下,可以在make menuconfig中修改“Development environment options”中的“Path prefix”来指定安装目录。如果使用其他目录,则需要注意相关的目录必须添加进环境PATH变量中,否则在编译MiniGUI应用程序时会出现找不到包含文件等错误信息。
接着要运行ldconfig加载新生成的链接库,否则将会出现类似找不到“libminigui-1.3.so.3”的错误消息。
出错记录:::
(1)
varbitmap.c:248: error: static declaration of 'var_bitmap_font_ops' follows non-static declaration
具体错误如下:
source='varbitmap.c' object='varbitmap.lo' libtool=yes /
depfile='.deps/varbitmap.Plo' tmpdepfile='.deps/varbitmap.TPlo' /
depmode=gcc3 /bin/sh ../../depcomp /
/bin/sh ../../libtool --mode=compile gcc -DHAVE_CONFIG_H -I. -I. -I../.. -I../../include -I../include -g -O2 -D__MINIGUI_LIB__ -D_REENTRANT -O2 -Wall -Wstrict-prototypes -pipe -DNDEBUG -c -o varbitmap.lo `test -f 'varbitmap.c' || echo './'`varbitmap.c
rm -f .libs/varbitmap.lo
gcc -DHAVE_CONFIG_H -I. -I. -I../.. -I../../include -I../include -g -O2 -D__MINIGUI_LIB__ -D_REENTRANT -O2 -Wall -Wstrict-prototypes -pipe -DNDEBUG -c varbitmap.c -MT varbitmap.lo -MD -MP -MF .deps/varbitmap.TPlo -fPIC -DPIC -o .libs/varbitmap.lo
varbitmap.c:248: error: static declaration of 'var_bitmap_font_ops' follows non-static declaration
varbitmap.h:38: error: previous declaration of 'var_bitmap_font_ops' was here
make[4]: *** [varbitmap.lo] 错误 1
make[4]: Leaving directory `/home/source/minigui/minigui1.3.x/libminigui-1.3.3/src/font'
make[3]: *** [all-recursive] 错误 1
make[3]: Leaving directory `/home/source/minigui/minigui1.3.x/libminigui-1.3.3/src/font'
make[2]: *** [all-recursive] 错误 1
make[2]: Leaving directory `/home/source/minigui/minigui1.3.x/libminigui-1.3.3/src'
make[1]: *** [all-recursive] 错误 1
make[1]: Leaving directory `/home/source/minigui/minigui1.3.x/libminigui-1.3.3'
make: *** [all] 错误 2
出错原因:
在src/font/varbitmap.h中定义了extern FONTOPS var_bitmap_font_ops,那里var_bitmap_font_ops为extern类型的,而在src/font /varbitmap.c中定义的是static类型,所以可能造成了编译的出错。
解决方法如下:(1)
修改src/font/varbitmap.c文件:
//static FONTOPS var_bitmap_font_ops = {
extern FONTOPS var_bitmap_font_ops = { // wmmwang 修改
(2)
重新运行make menuconfig,将“Font options”中的“Var bitmap font”选项去掉即可:
│ │
Raw bitmap font │ │
│ │ [ ] Var bitmap font │ │
│ │
Incore font sansserif │ │
│ │
Incore font courier │ │
│ │
Incore font symbol │ │
│ │
Incore font vgas │ │
│ │
Qt Prerendered Font │ │
│ │
TrueType font │ │
│ │
Adobe Type1 font │ │
(2)
source='grid.c' object='grid.lo' libtool=yes /
depfile='.deps/grid.Plo' tmpdepfile='.deps/grid.TPlo' /
depmode=gcc3 /bin/sh ../../depcomp /
/bin/sh ../../libtool --mode=compile gcc -DHAVE_CONFIG_H -I. -I. -I../.. -I./ -I../include -I../../include -g -O2 -D__MINIGUI_LIB__ -D_REENTRANT -O2 -Wall -Wstrict-prototypes -pipe -DNDEBUG -c -o grid.lo `test -f 'grid.c' || echo './'`grid.c
rm -f .libs/grid.lo
gcc -DHAVE_CONFIG_H -I. -I. -I../.. -I./ -I../include -I../../include -g -O2 -D__MINIGUI_LIB__ -D_REENTRANT -O2 -Wall -Wstrict-prototypes -pipe -DNDEBUG -c grid.c -MT grid.lo -MD -MP -MF .deps/grid.TPlo -fPIC -DPIC -o .libs/grid.lo
grid.c: In function 'AddCol':
grid.c:626: error: invalid lvalue in assignment
grid.c:627: error: invalid lvalue in assignment
grid.c:640: error: invalid lvalue in assignment
grid.c:641: error: invalid lvalue in assignment
grid.c:669: error: invalid lvalue in assignment
grid.c:670: error: invalid lvalue in assignment
grid.c:682: error: invalid lvalue in assignment
grid.c:683: error: invalid lvalue in assignment
grid.c: In function 'AddRow':
grid.c:735: error: invalid lvalue in assignment
grid.c:736: error: invalid lvalue in assignment
grid.c:747: error: invalid lvalue in assignment
grid.c:748: error: invalid lvalue in assignment
grid.c:776: error: invalid lvalue in assignment
grid.c:777: error: invalid lvalue in assignment
grid.c:790: error: invalid lvalue in assignment
grid.c:791: error: invalid lvalue in assignment
make[3]: *** [grid.lo] 错误 1
make[3]: Leaving directory `/home/source/minigui/minigui1.3.x/libminigui-1.3.3/ext/control'
make[2]: *** [all-recursive] 错误 1
make[2]: Leaving directory `/home/source/minigui/minigui1.3.x/libminigui-1.3.3/ext'
make[1]: *** [all-recursive] 错误 1
make[1]: Leaving directory `/home/source/minigui/minigui1.3.x/libminigui-1.3.3'
make: *** [all] 错误 2
出错原因:
未知。可能是编译器版本太高的缘故。
解决方法如下:
将上面出错的grid.c文件中对应行数的强制转换去掉。例如grid.c:626、627行修改如下:
//(PGRIDCOLHDR)pCell1->pRowHdr = pRowHdr; // wmmwang 修改
//(PGRIDCOLHDR)pCell1->pColHdr = pCol1;
pCell1->pRowHdr = pRowHdr;
pCell1->pColHdr = pCol1;
其他出错行同上修改。
步骤二:安装安装MiniGUI的资源包:
linux:/home/work/minigui/libminigui-1.3.3 # cd ../
linux:/home/work/minigui # cd minigui-res-1.3.3/
linux:/home/work/minigui/minigui-res-1.3.3 # make install
这一步一般不会出错
步骤三:安装mg-samples-1.3.1
linux:/home/work/minigui/qvfb-1.0 # cd ../mg-samples-1.3.1/
linux:/home/work/minigui/mg-samples-1.3.1 # ./configure
linux:/home/work/minigui/mg-samples-1.3.1 # make
linux:/home/work/minigui/mg-samples-1.3.1 # make install
出错记录:
(3)
. /usr/local/lib/libminigui.so: undefined reference to `pthread_kill_other_threads_np'
原因:删除 MiniGUI 源代码中调用'pthread_kill_other_threads_np'这个函数
的语句。应该在 src/kernel/init.c 文档中,也可以运行 grep 找一下这个函数。
步骤四:安装综合例子mde-1.3.0
linux:/home/work/minigui/qvfb-1.0 # cd ../mde-1.3.0/
linux:/home/work/minigui/mde-1.3.0 # ./configure
linux:/home/work/minigui/mde-1.3.0 # make
linux:/home/work/minigui/mde-1.3.0 # make install
步骤五:安装qvfb:
linux:/home/work/minigui # cd minigui-res-1.3.3/
linux:/home/work/minigui/minigui-res-1.3.3 # cd ../qvfb-1.0/
linux:/home/work/minigui/qvfb-1.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
(略过输出信息...)
linux:/home/work/minigui/qvfb-1.0 # make
(略过输出信息...)
linux:/home/work/minigui/qvfb-1.0 # make install
(略过输出信息...)
出错记录:
(4)在./configure时会报错:
checking for libpng... -lpng -lz -lm
checking for libjpeg6b... no
checking for libjpeg... -ljpeg
checking for Qt... configure: error: Qt (>= Qt 3.0.3) (headers and libraries) not found. Please check your installation!
For more details about this problem, look at the end of config.log.
由于在fc7在默认是没有完全安装qt的,所以需要安装一个软件,这个可以通过你的虚拟机加载fedora7的镜像文件,然后在fedora7的 cdrom中直接打开得到,即光盘下的feodra文件夹下的qt-devel-3.3.8-4.fc7.i386.rpm,点击安装
步骤六:minigui演示:
(1)进入/usr/local/etc/,将minigui.cfg修改为:
system]
# GAL engine
gal_engine=qvfb
# IAL engine
ial_engine=qvfb
mdev=/dev/mouse
mtype=IMPS2
[fbcon]
defaultmode=1024x768-16bpp
[qvfb]
defaultmode=640x480-16bpp
display=0
(2)进入/etc/ld.so.conf.d建一个minigui.conf,文件的内容为/usr/local/lib
最后要把系统共享库缓存刷新,将libminigui加载上,可以使用命令
[root@fedora7]#ldconfig
否则在运行应用程序时会报如下错:
./bomb
./bomb: error while loading shared libraries: libminigui-1.3.so.3: cannot open shared object file: No such file or directory
(3)然后就可以使用qvfb体验miniGUI了,进入qvfb1.0根目录下的qvfb文件夹,输入下面命令:
[root@fedora7]# qvfb &
加上&符号使qvfb进程开启后shell立即返回,否则会阻塞shell进程,需要再开一个shell才可以运行minigui程序。qvfb 运行起来后在qvfb中设置虚拟显示器分辨率:File-->Configure,注意Size和Depth要设置的同MiniGUI.cfg中的分辨率和色深一致。
(4)qvfb设置搞定后就可以运行mg-smaples-1.6.2/src中的例子了,运行一个helloworld试试效果
[root@localhost minigui-pc]# cd mde-1.3.0
[root@localhost mde-1.3.0]# cd bomb
[root@localhost bomb]# ./bomb
这时在qvfb界面上就OK了。也该睡觉了,晚安阿!