移植MiniGUI到S3C2410目标板

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

网上看到的大多数是1.3版本的,1.6.10的基于FC系统的几乎没有。写下这篇文章,帮助那些刚接触minigui的同仁们。

环境

宿主机:FC6

目标板:arm 9,s<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="3" unitname="C">3c</chmetcnv>2410, linux <chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">2.6.24</chsdate>.4

MiniGUI版本:<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False"><span lang="EN-US">1.6.10</span></chsdate> (http://www.minigui.org/res.shtml)

简介

MiniGUI是北京飞漫公司的产品,号称遵循GPL条款。有关MiniGui的官方消息看

http://www.minigui.org (英文网站) http://www.minigui.cm(中文网站)。目前开源的最新版本是MiniGUI <chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.6.10</chsdate>。但是它的未开源的增值版已经到3.0了,增加了好多功能。

主要代码包有

libminigu-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.6.10</chsdate>.tar.gz :该文件是minigui的主要源文件。MiniGUI由三个函数库组成,libminigui,libmgext,libvcongui

minigui-res-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.6.10</chsdate>.tar.gzminigui所使用的资源,包括字体,图标,位图,光标样式等。

mg-samples-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.6.10</chsdate>.tar.gz : <minigui编程指南>配套示例程序

mde-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.6.10</chsdate>.tar.gz : MiniGUI的综合演示程序包,有复杂示例。

交叉编译libminigui

交叉编译工具链如何安装,请参阅其他文章,网上很多。本文用的是buildroot的编译工具链。它可使用uclibc库,更精简。

编译器版本:arm-linux-gcc (GCC) <chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">3.4.2</chsdate>uclibc库版本libuClibc-0.9.28。如果在下面的步骤中,出现一些编译问题,大多数是由于gcc版本和c库问题,请配置好自己的交叉编译工具链。

首先要配置编译选项,在libminigui-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.6.10</chsdate>顶层目录下,通过使用configure脚本来进行相关的配置。运行configure脚本,会生成makefile文件,然后根据传递给configure脚本的各种选项来生成mgconfig.h文件。之后,运行makemake install命令,就可以编译MiniGUI并将MiniGUI的头文件和函数库安装到指定目录。

看到网上很多关于老的minigui<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.3.3</chsdate>版本的配置,都是使用make menuconfig ,而在新版里,已经不再通过这种方式来配置了,最好的方法是自己写脚本,来配置各选项。

我的脚本如下:

#!/bin/bash

rm config.cache config.status -f

CC=arm-linux-gcc \

CFLAGS=-I/usr/src/buildroot/build_arm/staging_dir/include \

./configure --prefix=/usr/local/minigui1.6.10/ \

--build=i386-linux \

--host=arm-unknown-linux \

--target=arm-unknown-linux \

下面解释脚本内容:

第一行rm –f 删除上次配置产生的文件。如果第一次配置,就不必了。为了保险,建议写上。

第二行CC=arm-linux-gcc 指定交叉编译器。请按照自己配置的交叉编译工具链来指定。

第三行 CFLAGS=-I/usr/src/buildroot/build_arm/staging_dir/include 编译选项。-I 指定编译器编译时使用的头文件路径。

第四行./configure --prefix=/usr/local/minigui<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.6.10</chsdate>/ 开始指定minigui的编译配置选项。

--prefix用于指定Minigui函数库的安装路径。默认安装路径是/usr/local,这里是/usr/local/minigui<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.6.10</chsdate> ,那么在执行make ,make install之后,函数库,头文件和参考手册页被安装在/usr/local/minigui1.6.10/lib , /usr/local/minigui1.6.10/include , /usr/local/minigui1.6.10/man目录下。

第五行--build=i386-linux 指定软件包安装的系统平台,如果没有指定,默认值是’--host’选项的值。这里指本主机。

第六行 --host=arm-unknown-linux 指定软件运行的系统平台,如果没有指定,将会运行’config.guess’来检测,因为我们生成的minigui的函数库在arm平台上运行,则指定arm-unknown-linux

第七行--target=arm-unknown-linux 指定软件面向的系统平台。这主要在编译器和汇编器上下文中起作用。

上面都是Minigui的一些重要配置选项。当然Minigui不止这些配置,还有很多选项,其他选项都采用默认值了。至于默认值是啥,可以运行

$./configure –help

详细列出各种配置选项及默认值。

运行该脚本之后, 产生makefile等几个文件。然后

make

make install

将函数库,头文件等安装到指定的路径中。

以上步骤如果出错,请仔细查看config.log,里面有详细的出错原因。比如,没有创建文件夹,编译路径有错等等,一目了然。

如果没有出错,检查一下你的--prefix选项指定路径里是否有以下文件(本文在/usr/local/minigui<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.6.10</chsdate>/下):

/usr/local/minigui<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.6.10</chsdate>/lib:

lrwxrwxrwx 1 root root 22 09-04 13:47 libmgext-1.6.so.10 -> libmgext-1.6.so.<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">10.0.0</chsdate>

-rwxr-xr-x 1 root root 218882 09-04 13:47 libmgext-1.6.so.<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">10.0.0</chsdate>

-rw-r--r-- 1 root root 240436 09-04 13:47 libmgext.a

-rwxr-xr-x 1 root root 743 09-04 13:47 libmgext.la

lrwxrwxrwx 1 root root 22 09-04 13:47 libmgext.so -> libmgext-1.6.so.<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">10.0.0</chsdate>

lrwxrwxrwx 1 root root 24 09-04 13:47 libminigui-1.6.so.10 -> libminigui-1.6.so.<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">10.0.0</chsdate>

-rwxr-xr-x 1 root root 1811526 09-04 13:47 libminigui-1.6.so.<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">10.0.0</chsdate>

-rw-r--r-- 1 root root 2029908 09-04 13:47 libminigui.a

-rwxr-xr-x 1 root root 757 09-04 13:47 libminigui.la

lrwxrwxrwx 1 root root 24 09-04 13:47 libminigui.so -> libminigui-1.6.so.<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">10.0.0</chsdate>

lrwxrwxrwx 1 root root 24 09-04 13:47 libvcongui-1.6.so.10 -> libvcongui-1.6.so.<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">10.0.0</chsdate>

-rwxr-xr-x 1 root root 73670 09-04 13:47 libvcongui-1.6.so.<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">10.0.0</chsdate>

-rw-r--r-- 1 root root 68716 09-04 13:47 libvcongui.a

-rwxr-xr-x 1 root root 757 09-04 13:47 libvcongui.la

lrwxrwxrwx 1 root root 24 09-04 13:47 libvcongui.so -> libvcongui-1.6.so.10

/usr/local/minigui<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.6.10</chsdate>/include/minigui:

colordlg.h dti.c gdi.h newfiledlg.h own_stdio.h threadx_semaphore.h vxworks_semaphore.h window.h

colorspace.h endianrw.h mgconfig.h nucleus_pthread.h psos_pthread.h ucos2_pthread.h win32_dirent.h

common.h ext mgext.h nucleus_semaphore.h psos_semaphore.h ucos2_semaphore.h win32_pthread.h

control.h filedlg.h minigui.h ose_semaphore.h skin.h vcongui.h win32_sched.h

ctrl fixedmath.h mywindows.h own_malloc.h threadx_pthread.h vxworks_pthread.h win32_semaphore.h

还有一个重要的配置文件/usr/local/minigui<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.6.10</chsdate>/etc/MiniGUI.cfg,没有这个文件,编译后的程序在板子上也无法执行的。当然,这个文件不能直接使用,还需修改,后面会讲到。

完成上面的步骤,已经不知不觉成功了大半了。

安装minigui资源库

GUI里包含很多图标,样式,这些都需要资源库。下面一起装上minigui的资源库

解压minigui-res-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.6.10</chsdate>.tar.gz

进入minigui-res-<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.6.10</chsdate>目录

make install

则资源文件都被装到/usr/local/lib/minigui/res下。(这一步,其实也不需要make install,后面用到资源,直接复制到板上根文件系统相应目录中即可。)

编译运行minigui的应用程序

网上文章里的helloworld示例,用minigui<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.6.10</chsdate>库,已经无法编译通过,库函数结构有了很大不同。我们可以从minigui的示例包中找个文件来进行编译。如

  1. animation.c
  2. /*
  3. **$Id:animation.c,v1.122007-08-3001:20:10xwyanExp$
  4. **
  5. **Listing36.1
  6. **
  7. **animation.c:SampleprogramforMiniGUIProgrammingGuide
  8. **UsageofANIMATIONcontrolandGIF89aloader.
  9. **
  10. **Copyright(C)2004~2007FeynmanSoftware.
  11. **
  12. **License:GPL
  13. */
  14. #include<stdio.h>
  15. #include<stdlib.h>
  16. #include<string.h>
  17. #include<minigui/common.h>
  18. #include<minigui/minigui.h>
  19. #include<minigui/gdi.h>
  20. #include<minigui/window.h>
  21. #include<minigui/control.h>
  22. #include<minigui/mgext.h>
  23. staticconstchar*filename="9.gif";
  24. intret;
  25. staticANIMATION*anim=NULL;
  26. staticintAnimationWinProc(HWNDhWnd,intmessage,WPARAMwParam,LPARAMlParam)
  27. {
  28. switch(message){
  29. caseMSG_CREATE:
  30. {
  31. anim=CreateAnimationFromGIF89aFile(HDC_SCREEN,filename);
  32. if(anim==NULL)
  33. return1;
  34. SetWindowAdditionalData(hWnd,(DWORD)anim);
  35. CreateWindowEx(CTRL_ANIMATION,
  36. "",
  37. WS_VISIBLE|ANS_AUTOLOOP|ANS_SCALED,
  38. WS_EX_TRANSPARENT,
  39. 100,
  40. 50,10,120,60,hWnd,(DWORD)anim);
  41. SendMessage(GetDlgItem(hWnd,100),ANM_STARTPLAY,0,0);
  42. CreateWindowEx(CTRL_ANIMATION,
  43. "",
  44. WS_VISIBLE|ANS_AUTOLOOP|ANS_FITTOANI,
  45. WS_EX_TRANSPARENT,
  46. 200,
  47. 50,160,120,60,hWnd,(DWORD)anim);
  48. break;
  49. }
  50. caseMSG_LBUTTONDOWN:
  51. SendMessage(GetDlgItem(hWnd,200),ANM_SETANIMATION,0,(LPARAM)anim);
  52. SendMessage(GetDlgItem(hWnd,200),ANM_STARTPLAY,0,0);
  53. break;
  54. caseMSG_DESTROY:
  55. DestroyAnimation((ANIMATION*)GetWindowAdditionalData(hWnd),TRUE);
  56. DestroyAllControls(hWnd);
  57. return0;
  58. caseMSG_CLOSE:
  59. ret=PostQuitMessage(hWnd);
  60. DestroyMainWindow(hWnd);
  61. return0;
  62. }
  63. returnDefaultMainWinProc(hWnd,message,wParam,lParam);
  64. }
  65. intMiniGUIMain(intargc,constchar*argv[])
  66. {
  67. MSGMsg;
  68. HWNDhMainWnd;
  69. MAINWINCREATECreateInfo;
  70. if(argc>=2)
  71. filename=argv[1];
  72. #ifdef_MGRM_PROCESSES
  73. JoinLayer(NAME_DEF_LAYER,"animation",0,0);
  74. #endif
  75. if(!InitMiniGUIExt()){
  76. return1;
  77. }
  78. CreateInfo.dwStyle=WS_CAPTION|WS_BORDER|WS_VISIBLE;
  79. CreateInfo.dwExStyle=WS_EX_NONE;
  80. #ifdef_LANG_ZHCN
  81. CreateInfo.spCaption="动画控件";
  82. #else
  83. CreateInfo.spCaption="AnimationControl";
  84. #endif
  85. CreateInfo.hMenu=0;
  86. CreateInfo.hCursor=GetSystemCursor(IDC_ARROW);
  87. CreateInfo.hIcon=0;
  88. CreateInfo.MainWindowProc=AnimationWinProc;
  89. CreateInfo.lx=0;
  90. CreateInfo.ty=0;
  91. CreateInfo.rx=240;//GetGDCapability(HDC_SCREEN,GDCAP_HPIXEL);
  92. CreateInfo.by=300;//GetGDCapability(HDC_SCREEN,GDCAP_VPIXEL);
  93. CreateInfo.iBkColor=PIXEL_lightgray;
  94. CreateInfo.dwAddData=0;
  95. CreateInfo.dwReserved=0;
  96. CreateInfo.hHosting=HWND_DESKTOP;
  97. hMainWnd=CreateMainWindow(&CreateInfo);
  98. if(hMainWnd==HWND_INVALID)
  99. return-1;
  100. ShowWindow(hMainWnd,SW_SHOWNORMAL);
  101. while(GetMessage(&Msg,hMainWnd)){
  102. TranslateMessage(&Msg);
  103. DispatchMessage(&Msg);
  104. }
  105. MainWindowThreadCleanup(hMainWnd);
  106. MiniGUIExtCleanUp();
  107. return0;
  108. }
  109. #ifndef_LITE_VERSION
  110. #include<minigui/dti.c>
  111. #endif

上面的程序用如下命令编译:

$arm-linux-gcc -I/usr/local/minigui<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.6.10</chsdate>/include -L/usr/local/minigui1.6.10/lib -O2 -o animation animation.c -lminigui -lmgext -lm -ljpeg -lpthread

如果出现未定义的函数名,则检查相关库文件是否存在或者库文件版本是否兼容。这里用到的库文件有libc,libminigui,libmgext,libm,libjpeg,libpthread

如果你的交叉编译工具链的库目录里缺少这些库,则参考网上其他文章,建立这些库。minigui<chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">1.6.10</chsdate>的下载页面上也提供了这些依赖工具。

如果编译未发现错误,那么恭喜你,你马上就会享受成功的喜悦了。

要在板上运行该编译好的程序,还需要做一些准备工作。

首先,将上面生成的库文件放到板上根文件系统lib目录中。动态编译的程序,需要依赖这些库文件,少了则无法运行。

有了库文件,还不够,还需要资源文件。资源文件放在/usr/local/lib/minigui/res里,读者也可根据自己习惯放置,但是在MiniGUI的配置里一定要指定到正确的路径,否则会找不到资源而报错。

另外,还需要MiniGUI的配置文件。这里要注意的是1.3.x的配置文件放在/usr/local,1.6.x的配置文件是放在/etc/下的。要想适合目标板环境,MiniGUI.cfg文件内容需要修改。修改如下:

# MiniGUI Ver <chsdate w:st="on" year="1899" month="12" day="30" islunardate="False" isrocdate="False">2.0.3</chsdate>/1.6.9

# This configuration file is for classic window style.

#

# Copyright (C) 2002~2007 Feynman Software

# Copyright (C) 1998~2002 Wei Yongming.

#

# Web: http://www.minigui.com

# Web: http://www.minigui.org

#

# This configuration file must be installed in /etc,

# /usr/local/etc or your home directory. When you install it in your

# home directory, it should be named ".MiniGUI.cfg".

#

# The priority of above configruation files is ~/.MiniGUI.cfg,

# /usr/local/etc/MiniGUI.cfg, and then /etc/MiniGUI.cfg.

#

# If you change the install path of MiniGUI resource, you should

# modify this file to meet your configuration.

#

# NOTE:

# The format of this configuration file has changed since the last release.

# Please DONT forget to provide the latest MiniGUI.cfg file for your MiniGUI.

#

[system]

# GAL engine and default options

gal_engine=fbcon

defaultmode=320x240-16bpp

# IAL engine

ial_engine=dummy

mdev=/dev/input/mice

mtype=IMPS2

[fbcon]

defaultmode=320x240-16bpp

[qvfb]

defaultmode=640x480-16bpp

display=0

# The first system font must be a logical font using RBF device font.

[systemfont]

font_number=6

font0=rbf-fixed-rrncnn-8-16-ISO8859-1

font1=*-fixed-rrncnn-*-16-GB2312

font2=*-Courier-rrncnn-*-16-GB2312

font3=*-SansSerif-rrncnn-*-16-GB2312

font4=*-Times-rrncnn-*-16-GB2312

font5=*-Helvetica-rrncnn-*-16-GB2312

default=0

wchar_def=1

fixed=1

caption=2

menu=3

control=3

[rawbitmapfonts]

font_number=4

name0=rbf-fixed-rrncnn-8-16-ISO8859-1

fontfile0=/usr/local/lib/minigui/res/font/8x16-iso8859-1.bin

name1=rbf-fixed-rrncnn-16-16-GB2312-0

fontfile1=/usr/local/lib/minigui/res/font/song-16-gb2312.bin

name2=rbf-fixed-rrncnn-6-12-ISO8859-1

fontfile2=/usr/local/lib/minigui/res/font/6x12-iso8859-1.bin

name3=rbf-fixed-rrncnn-12-12-GB2312-0

fontfile3=/usr/local/lib/minigui/res/font/song-12-gb2312.bin

[varbitmapfonts]

font_number=6

name0=vbf-Courier-rrncnn-8-13-ISO8859-1

fontfile0=/usr/local/lib/minigui/res/font/Courier-rr-8-13.vbf

name1=vbf-Helvetica-rrncnn-11-12-ISO8859-1

fontfile1=/usr/local/lib/minigui/res/font/Helvetica-rr-11-12.vbf

name2=vbf-Times-rrncnn-10-12-ISO8859-1

fontfile2=/usr/local/lib/minigui/res/font/Times-rr-10-12.vbf

name3=vbf-Courier-rrncnn-10-15-ISO8859-1

fontfile3=/usr/local/lib/minigui/res/font/Courier-rr-10-15.vbf

name4=vbf-Helvetica-rrncnn-15-16-ISO8859-1

fontfile4=/usr/local/lib/minigui/res/font/Helvetica-rr-15-16.vbf

name5=vbf-Times-rrncnn-13-15-ISO8859-1

fontfile5=/usr/local/lib/minigui/res/font/Times-rr-13-15.vbf

[qpf]

font_number=3

name0=qpf-unifont-rrncnn-16-16-ISO8859-1,ISO8859-15,GB2312-0,GBK,BIG5

fontfile0=/usr/local/lib/minigui/res/font/unifont_160_50.qpf

name1=qpf-times-rrncnn-5-10-ISO8859-1,ISO8859-15

fontfile1=/usr/local/lib/minigui/res/font/smoothtimes_100_50.qpf

name2=qpf-helvetica-rrncnn-5-10-ISO8859-1,ISO8859-15

fontfile2=/usr/local/lib/minigui/res/font/helvetica_100_50.qpf

name3=qpf-micro-rrncnn-4-4-ISO8859-1,ISO8859-15

fontfile3=/usr/local/lib/minigui/res/font/micro_40_50.qpf

[truetypefonts]

font_number=3

name0=ttf-arial-rrncnn-0-0-ISO8859-1

fontfile0=/usr/local/lib/minigui/res/font/arial.ttf

name1=ttf-times-rrncnn-0-0-ISO8859-1

fontfile1=/usr/local/lib/minigui/res/font/times.ttf

name2=ttf-pinball-rrncnn-0-0-ISO8859-1

fontfile2=/usr/local/lib/minigui/res/font/pinball.ttf

[type1fonts]

font_number=0

name0=type1-Charter-rrncnn-0-0-ISO8859-1

fontfile0=/usr/local/lib/minigui/res/font/bchr.pfb

name1=type1-Charter-rincnn-0-0-ISO8859-1

fontfile1=/usr/local/lib/minigui/res/font/bchri.pfb

name2=type1-Charter-brncnn-0-0-ISO8859-1

fontfile2=/usr/local/lib/minigui/res/font/bchb.pfb

name3=type1-Charter-bincnn-0-0-ISO8859-1

fontfile3=/usr/local/lib/minigui/res/font/bchbi.pfb

name4=type1-Courier-rrncnn-0-0-ISO8859-1

fontfile4=/usr/local/lib/minigui/res/font/dcr10.pfb

name5=type1-Courier-rincnn-0-0-ISO8859-1

fontfile5=/usr/local/lib/minigui/res/font/dcti10.pfb

name6=type1-Courier-brncnn-0-0-ISO8859-1

fontfile6=/usr/local/lib/minigui/res/font/dcbx10.pfb

name7=type1-Courier-bincnn-0-0-ISO8859-1

fontfile7=/usr/local/lib/minigui/res/font/dcbxti10.pfb

name8=type1-eufm10-rrncnn-0-0-ISO8859-1

fontfile8=/usr/local/lib/minigui/res/font/eufm10.pfb

[mouse]

dblclicktime=300

[event]

timeoutusec=300000

repeatusec=50000

[cursorinfo]

# Edit following line to specify cursor files path

cursorpath=/usr/local/lib/minigui/res/cursor/

Ms

你可能感兴趣的:(linux,gcc,脚本,C#,Office)