醛和醇反应生成什么:MiniGUI 1.3.3 移植详解2

来源:百度文库 编辑:中财网 时间:2024/05/05 23:03:05
MiniGUI 1.3.3 移植详解2 [转]

OK ,下面是把 minigui 移植到你的板子上去了。

我在 /opt 目录下建立了一个 rootfs 目录,即 /opt/rootfs  ,用来建立我的嵌入式系统的根目录,现在我需要把 minigui 的库文件放到里面去,

建立目录
[Root]# mkdir –p /opt/rootfs/usr/local/[lib,etc]

把 /usr/local/arm/2.95.3/arm-linux/lib 中相应的库拷到 /opt/rootfs/usr/local/lib 目录下去
下面是我拷的库文件:

libjpeg.a          libmgext-1.3.so.3        libminigui.a   libpng.so.2            libttf.a                 libz.so
libjpeg.la         libmgext-1.3.so.3.0.0    libminigui.la  libpng.so.2.1.0.10rc1  libttf.so              libz.so.1
libjpeg.so        libmgext.a               libminigui.so  libpopt.a              libvcongui-1.3.so.3      libz.so.1.2.3
libjpeg.so.62      libmgext.la              libm.so        libpopt.la             libvcongui-1.3.so.3.0.0  minigui
libjpeg.so.62.0.0  libmgext.so              libm.so.6      libpopt.so             libvcongui.a             shared
libm-2.2.3.so      libminigui-1.3.so.3      libpng.a       libpopt.so.0           libvcongui.la
libm.a             libminigui-1.3.so.3.0.0  libpng.so      libpopt.so.0.0.0       libvcongui.so

其中一些 .a 的静态库是不需要拷过去的,我图方便,一起拷了,呵,懒人的做法

同时修改 /opt/rootfs/etc/ld.so.conf ,在里面最后新加入一行  /usr/local/lib

然后执行 [Root] ldconfig –r /opt/rootfs     //把 rootfs 当成根目录,执行

OK,库文件准备完毕

下面把资源文件也拷过来,还记得吗,在前面 搭建 PC 环境中讲过安装资源文件,它被装在了 /usr/local/lib 目录下,一个叫 minigui 的目录,我们要做的就是把它拷过来

[Root]# cp –r –a /usr/local/lib/minigui  /opt/rootfs/usr/local/    连目录一起拷过来,目录结构和主机一样

把配置文件也拷过来

[Root]# cp /usr/local/etc/MiniGUI.cfg   /opt/rootfs/usr/local/etc/   记住,保持目录结构的一致

修改 MiniGUI.cfg ,如下

[system]
# GAL engine
gal_engine=fbcon     //这里修改

# IAL engine
ial_engine=dummy      // 这里修改,我不知道你会用什么触摸屏,所以就用dummy肯定不会错

mdev=/dev/touchscreen/0raw  //解摸屏,如果前面是 dummy ,则这里改不改无所谓
mtype=none

[fbcon]
defaultmode=240x320-16bpp  // 根据你的LCD大小自己设置,设置错误minigui 就启动不了


ial_engine 一开始建议用 dummy ,先让 minigui 跑起来,以后再把 触摸屏 加进去,保证尽可能减少错误的发生

保存,退出。 OK ,你的板子上的系统也搭建完毕了,现在来让真正的图形界面跑起来!:)

注意:你Build 你的 嵌入式 Linux 内核时,在 Console 中一定要先上 FrameBuffer ,从4位色一直到 16 位色的支持,全选上吧,同时把 VGA TextOut 选项勾掉,不要选它!!!!!!!!!!

内核启动时就要激活 FrameBuffer ,不然 minigui 没法启动起来,激活的方法就是给它传内核参数 vga=xxx 之类的。


3.启动你的 MiniGUI 的图形界面

看看你的 Windows 操作系统,左下方是一个 [开始] 按钮,然后是 任务条 ,MiniGUI 也提供了类似的界面,这就是一个叫 mginit 的程序,它启动后就跟widnows的界面很像了,它就在 mde 包里面,还记得最初让你下载的那个程序包吗??  现在我们就来安装它!!:)

[user]# tar zxf mde-1.3.0.tar.gz
[user]# cd mde-1.3.0

//我们先对 mginit 程序做一点小修改,呵

[user]#  cd mginit ; vi mginit.c


在 297 行处,把下面代码注释掉

/***************
   AboutMiniGUI ();
AboutMDE ();
**************/
保存,退出即可。

因为我们没有 触摸屏 现在,没法点它的 确认 按钮,所以把这些 About 信息去掉:)

好了,现在来编译吧,在mde-1.3.0 目录里
[user]# ./configure --prefix=/opt/rootfs/usr/local --host=arm-linux
[user]# make

如果你发现 mginit 目录下的程序没有被编译,那就说明你的 libminigui 配置不正确,记住,你必须是配置为 Lite 模式,这个程序才会被编译


[user]# make install

事实上证明,make install,根本没用,它什么都没做,do nothing
所以还是我们自己动手来做吧,呵

[Root]# mkdir –p /opt/rootfs/usr/local/lib/shared/miniguiapps    //建立了一个我们自己的目录,好长,呵

[Root]# cp –r –a  mde-1.3.0/*   /opt/rootfs/usr/local/lib/shared/miniguiapps

直接全部拷过去,然后到 /opt/rootfs/usr/local/lib/shared/miniguiapps 的各个程序目录下去,比如 mginit , bomb , painter 之类的,把不用的 .c .h .o Makefile 之类的全删除掉,保留 可执行文件和相应的 res 目录下的资源

注意,保持目录的结构,mginit.rc 文件不要删了,这个对mginit 程序很重要


OK,最后一步了,修改配置文件

[Root]#  vi  /opt/rootfs/linuxrc 文件

一般你配置嵌入式系统的时候都会有这个文件,用来执行一些系统的初始化工作,如果没有,就在你相应的初始化脚本(例如 etc/inittab)中加入下面的语句

mknod /dev/ttyp5 c 3 5
mknod /dev/ptyp5 c 2 5

cd /usr/local/lib/shared/miniguiapps/mginit
./mginit

注意:最后执行 mginit 命令的方式,先进入到它所在的目录,然后再执行,千万不要只写成

/usr/local/lib/shared/miniguiapps/mginit/mginit

因为 mginit 执行时在“当前目录”的res文件夹下搜索显示的资源,这种写法则“当前目录”为 / 根目录,所以会找不到 res 文件夹,于是显示错误
“ Can not create taskbar! ” 就退出了!

如果运行时显示没有 mknod 命令,请检查一下你的 busybox 的配置 :)

切记切记!


好了,一切成功了,现在放到你的板子上去试试吧:)

[Root]# cd /opt
[Root]# mkcramfs  rootfs  root.cramfs  制作根文件系统镜像,把 root.cramfs 烧到你的板子里面就OK了,启动,就可以看到 minigui 的图形界面启动了 :)


注意: 因为你的 minigui 是按 Lite 模式编译的,如果必须 mginit 首先运行起来,你其它的程序(比如 bomb ,或是 helloword)才能执行,如果 mginit 没有运行起来你就执行 helloword 的话,就会显示错误

“ Can not attach shared resource ! ”

4.为  minigui 开发程序


环境配好了,现在是开发自己的程序了,呵呵,写个简单的 Helloword 程序


/*
** $Id: helloworld.c,v 1.7 2003/06/13 07:15:49 weiym Exp $
**
** Listing 2.1
**
** helloworld.c: Sample program for MiniGUI Programming Guide
**      The first MiniGUI application.
**
** Copyright (C) 2003 Feynman Software.
**
** License: GPL
*/

#include

#include
#include
#include
#include

static int HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
   HDC hdc;
   switch (message) {
       case MSG_PAINT:
           hdc = BeginPaint (hWnd);
           TextOut (hdc, 100, 100, "Hello, world!");
           EndPaint (hWnd, hdc);
           return 0;

       case MSG_CLOSE:
           DestroyMainWindow (hWnd);
           PostQuitMessage (hWnd);
           return 0;
   }

   return DefaultMainWinProc(hWnd, message, wParam, lParam);
}

int MiniGUIMain (int argc, const char* argv[])
{
   MSG Msg;
   HWND hMainWnd;
   MAINWINCREATE CreateInfo;

#ifdef _LITE_VERSION
   SetDesktopRect(0, 0, 1024, 768);
#endif

   CreateInfo.dwstyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;
   CreateInfo.dwExstyle = WS_EX_NONE;
   CreateInfo.spCaption = "Hello, world";
   CreateInfo.hMenu = 0;
   CreateInfo.hCursor = GetSystemCursor(0);
   CreateInfo.hIcon = 0;
   CreateInfo.MainWindowProc = HelloWinProc;
   CreateInfo.lx = 0;
   CreateInfo.ty = 0;
   CreateInfo.rx = 320;
   CreateInfo.by = 240;
   CreateInfo.iBkColor = COLOR_lightwhite;
   CreateInfo.dwAddData = 0;
   CreateInfo.hHosting = HWND_DESKTOP;
   
   hMainWnd = CreateMainWindow (&CreateInfo);
   
   if (hMainWnd == HWND_INVALID)
       return -1;

   ShowWindow(hMainWnd, SW_SHOWNORMAL);

   while (GetMessage(&Msg, hMainWnd)) {
       TranslateMessage(&Msg);
       DispatchMessage(&Msg);
   }

   MainWindowThreadCleanup (hMainWnd);

   return 0;
}

#ifndef _LITE_VERSION
#include
#endif

首先在 PC 上编译,验证通过!

[user]# gcc  -o helloword  helloword.c  -lminigui –lmgext

如果没有错误,运行 qvfb ,按前面说的设置好,然后执行 [user]# ./helloword

一切正常,没有错误,现在就要把它放到我们的 板子上去跑了

[user]# arm-linux-gcc –O2 –o helloword helloword.c –lminigui –lmgext

编译完后,把它烧到板子的某个目录下,就可以在 板子上跑了!

所以这里就是说,minigui 提供了让你在 PC 上就可以调试和运行程序的方法(使用qvfb ),等你保证程序正确了以后,只需要把它重新编译一下,放到板子上去就行了!


5.一些常见的问题

这几天遇到不一些问题,发现论坛上也基本上没人回答我,所以只好自己解决了,这里把一些问题写出来,方便有需要的人:

问题1:在板子上跑的程序都显示 can not find qvfb …  之类,可是我只是想让它在板子上跑在 FrameBuffer 之上啊?

解决:在编译 libminigui 的时候,把
[ ] Use incore (built-in) resource        //建议不要选这个,老有问题
[ ]   NEWGAL engine on Qt Virtual FrameBuffer     //建议不要选这个,不然老让你用qvfb


问题2:编译的时候老出现  unreferenced to vbf_Courier8x8()  之类的问题

解决:
[ ] Var bitmap font  //千万不要选这个,不然会出现 unreferenced vfb_Courier8x8() 之类的错误


问题3:一切都搞定了,可是执行 mginit() 的时候就崩溃了,把所有的寄存器值打印了出来,然后显示了个 Abort() 就退出了!

解决:
[ ] IME (GB2312) Intelligent Pinyin module   //千万不要选这个,不然后面你的 mginit 程序一启动就崩溃了


问题4: 为什么我执行 helloword 就显示 “Can not attach shared resource!”

解决:
注意: 因为你的 minigui 是按 Lite 模式编译的,如果必须 mginit 首先运行起来,你其它的程序(比如 bomb ,或是 helloword)才能执行,如果 mginit 没有运行起来你就执行 helloword 的话,就会显示错误

“ Can not attach shared resource ! ”

问题5:怎么把自己的程序加到 minigui 的 taskbar 上去,并且排在前面??

解决:
查看 mginit 目录下的 mginit.rc 文件,里面就是配置,我想你能看明白的 :)


问题6:为什么我的程序显示 can not find libminigui.so ??

解决:你是否忘了在 etc/ld.so.conf 中加入 /usr/local/lib ,并且执行 ldconfig 程序? 看前面说的方法

好了,就写这么多吧,希望对新手有所帮助!