1. 程式人生 > >MiniGUI 移植到pc和arm開發板全過程詳解 及錯誤解答

MiniGUI 移植到pc和arm開發板全過程詳解 及錯誤解答

最近移植了 MiniGUI 1.3.3 到一個開發板上,中間遇到許多問題,在論壇上發問題,結果也沒
多少人回我,就算偶爾有回的,基本上回答也沒有什麼用,網上找不到一個完整的移植文章,所
以就決定把自己這次移植摸出來的一些方法寫出來,給像我一樣的小菜鳥做個參考吧。本文不教
你怎麼寫驅動,只是教怎麼樣在最短的時候在你的PC 機上搭建起開發環境,同時在你的板子上
跑起MiniGUI 來,這樣你就可以在PC 上開發好程式,除錯完畢,然後交叉編譯一下,直接Copy
到板子上就可以了。
首先,你需要下載的MiniGUI 的包:
http://www.minigui.com/download/libminigui-1.3.3.tar.gz


http://www.minigui.com/download/minigui-res-1.3.3.tar.gz
這兩個包的下載需要你在http://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 一些小例

好,首先就下載這幾個包吧,後面還有需要下載的包,後面再說
1.PC 環境的搭建
首先你需要一個 Linux 環境,我安裝的是 RedHat 9.0 安裝時記著選 everything ,這樣可
以避免到時候編譯少了東西。這裡搭建的環境是讓 MiniGUI 在你的 PC 上可以跑起來,這樣
以後你開發程式就可以只在 PC 上開發,除錯好,最後交叉編譯一下放到板子上就行了。後面
會講怎麼為板子編譯MiniGUI ,耐心的看吧:)
首先建立自己的開發目錄
[Root]# mkdir /opt
[Root]# cd /opt
[Root]# mkdir st2410 //這個是我的板子,
[Root]# chmod 777 st2410 //給一般使用者操作許可權
[user]# cd /opt/st2410 //進到目錄中去,在這個目錄下工作,用普通使用者來工作
把 libminigui-1.3.3.tar.gz 解開
[user]# tar zxf libminigui-1.3.3.tar.gz
[user]# tar zxf minigui-res-1.3.3.tar.gz
編譯 libminigui ,這個是 minigui 執行所必需的庫檔案,必須編譯成功
[user]# cd libminigui-1.3.3
[user]# ./configure //最簡單的編譯方式,讓它自己去配置 ,這裡採用預設的
Thread 模式而不是Lite 模式,因為這種方式在 PC 機上使用最方便,後面移到板子上再改成
Lite 模式即可

注意螢幕上的輸出,特別是下面幾條
checking for FrameBuffer console support... yes
checking for pthread library... yes
checking for TT_FreeType_Version in -lttf... yes
checking for T1_InitLib in -lt1... no
checking for jpeg_std_error in -ljpeg... yes
checking for png_check_sig in -lpng... yes
其中 –lttf –lpng 必須是 yes ,不然後面你的程式肯定會有問題,如果這裡不是 yes 的話,
肯定是你的 Redhat 9 安裝不對,告訴過你安裝時選 everything ,你選了嗎???
其中 ttf 庫是對 TrueType 字型的支援,png 庫是對 png 圖形的支援,MiniGui 裡都需要
這兩個,在後面為板子交叉編譯的時候也需要這兩個,不然你的程式跑不起來,切記切記。
好了,現在通過了,下面是編譯了
[user]# make
接來來就是漫長的等待了,讓它慢慢的編譯吧,呵
[user]# su //切到 Root 使用者許可權下,不然安裝時沒法把檔案寫到你的 /usr/local
目錄下
[Root]# make install
好了,庫安裝完畢,下面是安裝資源
[Root]# cd /opt/st2410/minigui-res-1.3.3
[Root]# make install
OK,基本的安裝完成了,現在檢查一下
看看在你的目錄 /usr/local/lib 下是不是有以下檔案
libmgext-1.3.so.3 -> libmgext-1.3.so.3.0.0
libmgext-1.3.so.3.0.0
libmgext.a
libmgext.la
libmgext.so -> libmgext-1.3.so.3.0.0
libminigui-1.3.so.3 -> libminigui-1.3.so.3.0.0
libminigui-1.3.so.3.0.0
libminigui.a
libminigui.la
libminigui.so -> libminigui-1.3.so.3.0.0
libvcongui-1.3.so.3 -> libvcongui-1.3.so.3.0.0
libvcongui-1.3.so.3.0.0
libvcongui.a
libvcongui.la
libvcongui.so -> libvcongui-1.3.so.3.0.0

裡面還有一個目錄 minigui , 可以進到裡面去看, 分別為 minigui/res/ [bmp ,
cursor,icon ,…..] 好幾個目錄,裡面有相應的檔案
檢查 /usr/local/include 裡面是不是多了一個 minigui 目錄,/usr/local/include/minigui
時面好多的 .h 檔案,如下:
common.h control.h endianrw.h fixedmath.h mgext.h mywindows.h vcong
ui.h
config.h dti.c filedlg.h gdi.h minigui.h skin.h window.h
如果這裡檢查沒有這些東西的話,那你前面的步驟肯定有問題,自己檢查一下吧。
首先,修改你的 /etc/ld.so.conf 檔案,在裡面最後新加入一行 /usr/local/lib
然後執行 [Root]# ldconfig  重新整理緩衝區
OK !
[Root]# vi /usr/local/etc/MiniGUI.cfg
在裡面找到
[system]
# GAL engine
#gal_engine=fbcon
gal_engine=qvfb //
裡修改  就是用這條語句替代上面的那條語句
# IAL engine
#ial_engine=console
ial_engine=qvfb //這裡修改
mdev=/dev/mouse
mtype=IMPS2
[fbcon]
defaultmode=1024x768-16bpp
[qvfb]
defaultmode=640x480-16bpp //這裡修改
display=0
儲存一下,OK 了!
現在你需要安裝一個 qvfb ,因為 Redhat 9 裡面沒有,從下面地址下載
http://www.minigui.com/downloads/dep-libs/qvfb-1.0.tar.gz
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
老方法:
[user]# tar zxf qvfb-1.0.tar.gz
[user]# cd qvfb-1.0
[user]# ./configure
[user]# make
[user]# make install
在這個過程中如果出現 error while loading shared libraries: libqt-mt.so.3: cannot
open shared object file
說明你的系統少了 libqt-mt.so.3 這個庫,還是回去檢查一下,你安裝時Redhat 時是否選了
everything ,或者在實際操作的過程中,這個庫有可以被誤刪除掉,我就出現過,這時候你可
以 google 一下 ,輸入 libqt-mt.so.3 redhat 9 ,應該就可以搜到相應的 rpm 包,安裝時
[root]# rpm –i --force [你的包名] 就OK 了
這裡有個下載地址,可以試試,我是用訊雷下載的,別的工具沒試過
ftp://ftp.pbone.net/mirror/www-ccrma.stanford.edu/planetccrma/mirror/redhat/li
nux/planetccrma/9/en/os/i386/qt33-3.3.3-0.1.rh90.ccrma.i386.rpm
注意:在你後面的操作過程中有可能會導致 libqt-mt.so.3 丟失,這時候只要重灌一下就OK

解決了這個問題後重復安裝過程
[user]# ./configure
[user]# make
[user]# make install

OK 。。。

OK ,環境搭建好了,下面是測試了:)
還記得前面讓你下載的 mg-samples-1.3.0.tar.gz 這個包吧,這個就是一些例子,現在試試
吧:)
[user]# tar zxf mg-samples-1.3.0.tar.gz
[user]# ./configure
[user]# make
[user]# cd src
看看 src 目錄下是不是已經編譯出可執行檔案來了
現在來執行一下吧,首先把 qvfb 加到你的可執行路徑中去
[user]# cd $HOME
[user]# vi .bashrc
在 .bashrc 最後面加上一句
export PATH="$PATH:/sbin:/usr/local/arm/2.95.3/bin:/usr/local/bin:/usr/local"
儲存退出,這裡面有些路徑是為以後用的,比如 /usr/local/arm/2.95.3/bin ,先加上吧:)
[user]# source .bashrc //讓它執行一下,當然你也可以選擇重啟一下電腦,效果是一樣的,

執行例子程式:
[user]# qvfb & //在圖形介面下執行,呵,別告訴我你只在命令列工作啊 :)
640x480à Configure à在 qvfb 中選 File VGA 16bit ,這樣看起來舒服
[user]# cd /opt/st2410/ mg-samples-1.3.0/src
[user]# ./helloword
OK ,這個時候你應該可以看到在 qvfb 中的執行效果了吧,記住:一定要先執行 qvfb ,並
且設定 qvfb ,然後再執行你的程式,而且qvfb 每重啟一次就需要重新設定一下,真麻煩
OK 你的 PC 環境搭建完畢了,你現在可以在 PC 上開發你的程式,並且編譯,並在 qvfb 中
執行,等完全驗證它是正確的了,把它交叉編譯一下,放到板子上去就可以了,呵呵:)
MiniGUI 還有一種執行方式,就是在 Console 下在 Framebuffer 上執行,這種方式太麻煩,
在PC 上不推薦,你還是用 qvfb 執行吧,方便,呵

如果要在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=1024x768-16bpp
[qvfb]
defaultmode=640x480-16bpp
display=0


重啟動你的 RedHat 9 ,在出現 Grub 的時候按 E 鍵,在 kernel =….. 這一行的最後
加入 vga=0x317 ,然後 Enter ,然後在 kernel=… 這一行上按 b 就可以了,這時候
可以在啟動時看到一個小企鵝的圖示,OK

(或者 編輯 /boot/grub/menu.lst 文
件,複製某個已有的核心啟動選項,並在 kernel 打頭的一行末尾新增 vga=0x0317 選項,
如下所示:
# g r u b. c o nf g en e r at e d b y an a c on d a
#
# N o t e t h at y ou d o n o t h a ve t o r e ru n gr u b a f t e r m ak i n g c h an g e s t o t h i s f i l e
# N O T IC E : Y o u d o n o t h a v e a /b o o t p a rt i t io n . T h is m ea n s t h a t
# a l l k e rn e l a n d i n i tr d pa t h s a r e r e l at i ve t o / , e g .
# r o ot ( hd 0 , 0)
# k e rn e l / b o ot / v ml i n uz - v er s i on r o r o o t= / de v / hd a 1
# i n it r d / b o ot / i ni t r d- v e rs i o n. i m g
# b o o t =/ d e v/ h d a
d e f a u lt = 0
t i m e o ut = 1 0
s p l a s hi m a ge = ( hd 0 , 0) / b oo t / gr u b /s p l as h . xp m . gz
t i t l e R e d H a t L i n ux ( 2. 4 . 18 - 3 , F r am e B uf f e r)                   //增加這些語句
r oo t (h d 0 ,0 )
k er n e l / b oo t / vm l i nu z - 2. 4 . 18 - 3 r o ro o t = /d e v/ h d a1 v ga = 0 x0 3 1 7
i ni t r d / b oo t / in i t rd - 2 .4 . 1 8- 3 . im g

t i t l e R e d H a t L i n ux ( 2. 4 . 18 - 3 )
r oo t (h d 0 ,0 )
k er n e l / b oo t / vm l i nu z - 2. 4 . 18 - 3 r o ro o t = /d e v/ h d a1
i ni t r d / b oo t / in i t rd - 2 .4 . 1 8- 3 . im g

並在啟動項是選擇H a t L i n ux ( 2. 4 . 18 - 3 , F r am e B uf f e r)    


進去後,直接在 例子程式的目錄下執行 ./helloword 就可以了 :)


2.為你的實驗板進行交叉編譯
OK,PC 機的開發環境已經建立好了,下面就是要移植到我們的板子上去了,這裡不介紹怎麼
移植 Linux 系統,假設你已經有一個可以在板子上跑的 Linux 系統了,並且已經有一個可以
用的根檔案系統了,並且已經有了板子相對應的LCD 的驅動程式,這裡介紹怎麼在你的根檔案
系統里加上 MiniGUI ,使得你的板子有圖形介面的顯示。
要交叉編譯,首先就得有交叉編譯器,這裡介紹 arm 板的交叉編譯。不要自己去編譯,直接去
下載個就行了。
ftp://ftp.arm.linux.org.uk/pub/linux/arm/toolchain/cross-2.95.3.tar.bz2
記住這個 ftp ,最好的 arm 工具下載站,
下載回來,有35Mb,呵
安裝交叉編譯工具:
[Root]# mkdir –p /usr/local/arm
[Root]# cd /usr/local/arm
[Root]# tar jxf cross-2.95.3.tar.bz2 //把工具直接解到壓縮到這個目錄下就安裝完成了,
簡單吧:)
解壓縮後生成一個 2.95.3 目錄,裡面在就是工具
記住, 這時候的gcc 為 2.95.3/bin/arm-linux-gcc 而它的 include 為
2.95.3/arm-linux/include ,對應的 lib 為 2.95.3/arm-linux/lib
也就是說, 你如果用 arm-linux-gcc 編譯程式的話, 它預設的就找
2.95.3/arm-linux/include 2.95.3/arm-linux/lib 兩個目錄,而不是 /usr/include ,所
以如果你要加什麼 .h .a .so 檔案話,記著一定是加到這兩個目錄下去,不然編譯器會告訴你
找不到這些東西的
把可行程式的路徑加入到 PATH 中去,還記得前面說過的改 .bashrc 檔案嗎?
[user]# cd $HOME
[user]# vi .bashrc
在 .bashrc 最後面加上一句
export PATH="$PATH:/sbin:/usr/local/arm/2.95.3/bin:/usr/local/bin:/usr/local"

[user]# source .bashrc
OK ,交叉編譯工具安裝完了,夠簡單吧:)
MiniGUI 的編譯需要一些庫檔案,預設我們的 gcc 基本上都有這些庫檔案,所以不需要安裝,
可是現在要交叉編譯了,交叉編譯器可是不帶這些庫檔案的,所以我們得首先自己編譯這些庫文
件裝到交叉編譯器中去。
注意一點:庫不一定要裝最新的,庫版本太新,MiniGUI 有可能不認識,像jpeg 庫和 ttf 庫
就是這樣,太新了反而用不了,所以要注意版本,以下的庫都是我驗證過可以和MiniGUI 一起
工作的,其它版本的庫沒試過,不保證能正確通過:)
首先安裝 zlib 庫,這個是後面的庫的編譯基礎。
http://www.zlib.net/zlib-1.2.3.tar.gz 400 多K,去下載吧,
下載到目錄 /opt/st2410 下
[user]# tar zxf zlib-1.2.3.tar.gz
由於 zlib 庫的configure 指令碼不支援交叉編譯選項,只好自己動用了,手動臨時把 gcc 修改
成指向我們的交叉編譯器 arm-linux-gcc
[Root]# cd /usr/bin
[Root]# mv gcc gcc_back
[Root]# ln -s /usr/local/arm/2.95.3/bin/arm-linux-gcc ./gcc
[Root]# mv ld ld_back
[Root]# ln -s /usr/local/arm/2.95.3/bin/arm-linux-ld ./ld
OK ,修改完成後回到 /opt/st2410/zlib-1.2.3 目錄下
[user]# ./configure --prefix=/usr/local/arm/2.95.3/arm-linux/ --shared
注意: 這裡配置指向 /usr/local/arm/2.95.3/arm-linux/ 目錄, 會自動安裝在
/usr/local/arm/2.95.3/arm-linux/ [include,lib] 目錄下,千萬不要裝錯目錄了,不然後面
會找不到這個庫的
[user]# make
[Root]# make install
安裝完後檢查一下目錄 /usr/local/arm/2.95.3/arm-linux/ [include,lib] ,假如 include
中沒有 zlib.h 之類的標頭檔案,lib 中沒有 libz.so.1.2.3 ,那就自己手動拷到這些目錄下去,
記著拷的時候把所有的 *.h 都需要拷過去,在拷庫的時候用 cp –a libz.* /…./lib 就行,要
用上 –a 選項
記著把剛才改過的 gcc 再改回去,不然後面會出錯的!!!!!
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
安裝 png 庫,這個是用來顯示 png 圖形的,MiniGUI 裡很多圖都是 png 的,如果沒有這
個庫,你的 MiniGUI 將無法正常工作,切記切記!
http://superb-east.dl.sourceforge.net/sourceforge/libpng/libpng-1.0.10rc1.tar.gz
還是那句話,庫不要用最新的,最新的容易有問題,用這個老一點的就沒問題了,呵
[user]# tar zxf libpng-1.0.10rc1.tar.gz
[user]# cd libpng-1.0.10rc1
Libpng 不提供有效的 configure 指令碼,所以只好自己動手改 Makefile 檔案了
[user]# cp scripts/makefile.linux Makefile //把 Scripts 下的一個 makefile 拷出來
自己動手改
[user]# vi Makefile // 自己動手改
CC=arm-linux-gcc //修改這裡
# where "make install" puts libpng.a, libpng.so*, png.h and pngconf.h
prefix=/usr/local/arm/2.95.3/arm-linux //修改這裡
# Where the zlib library and include files are located
#ZLIBLIB=/usr/local/lib
#ZLIBINC=/usr/local/include
ZLIBLIB=/usr/local/arm/2.95.3/arm-linux/lib //修改這裡
ZLIBINC=/usr/local/arm/2.95.3/arm-linux/include //修改這裡
好了,儲存,然後去編譯吧
[user]# make
[user]# make install
如果有錯誤,檢查你前面的步驟哪個沒做對 :) 尤其是 zlib 的安裝
還是前面說的,檢查 /usr/local/arm/2.95.3/arm-linux/ [include,lib] 目錄中有成功安裝
否,如果沒有安裝成功,那就自己把編譯出來的東西拷過去。記著,*.h 和 .so 的檔案都要拷。
OK,現在來安裝 jpeg 庫
ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz 自己去下載,速度暴慢
[user]# tar zxf jpegsrc.v6b.tar.gz
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
[user]# cd jpeg-6b
[user]# ./configure –help //可以檢視它的配置選項
一般情況下用 [[email protected] jpeg-6b]$ ./configure
--prefix=/usr/local/arm/2.95.3/arm-linux/ --host=arm-linux --enable-shared
--enable-static
--host=arm-linux 來指定交叉編譯選項,可是這裡死活它不認,所以改用別的方法,如下
[user]# ./configure --prefix=/usr/local/arm/2.95.3/arm-linux/ CC=arm-linux-gcc
--enable-shared --enable-static
[user]# make
安裝前需要在 arm-linux 下建個目錄,不然安裝會出錯
[Root]# mkdir –p /usr/local/arm/2.95.3/arm-linux/man/man1
[Root]# make install // OK 了
一樣,自己去檢查一下安裝是否成功 :)
最後安裝 libttf 庫,這個是 TrueType 字型的支援庫,用來顯示文字的。
http://nchc.dl.sourceforge.net/sourceforge/freetype/freetype-1.3.1.tar.gz
注意:MiniGUI 的文件說只支援 1.3.1 版本的 ttf 庫,不要把版本弄錯了 :)
這個庫裝起來最麻煩,全部自己手動編譯,安裝,下面一步一步來做吧:)
[user]# tar zxf freetype-1.3.1.tar.gz //老一套
[user]# cd freetype-1.3.1 //進到目錄裡去
[user]# mkdir –p /opt/st2410/libttf/extend // 自己另外建立一個目錄
[user]# cp freetype-1.3.1/lib/* freetype-1.3.1/lib/arch/ansi/* libttf/ //把有用的
東西拷出來
[user]#cp freetype-1.3.1/lib/extend/* libttf/extend/ 把 extend 目錄下的檔案也
拷出來
注意 cp 命令不要用 –r 選項,因為會把一些沒用的東西出拷出來的
拷貝完成了,現在來自己手動編譯了
[user]# cd libttf
[user]# arm-linux-gcc -c -fPIC -O2 freetype.c //不要奇怪,對,我們只要編譯這

一個 .c 檔案,因為它包括了其它所有的 .c 檔案了,你可以自己檢視它的內容
[user]# arm-linux-gcc -c -fPIC -O2 -I./ extend/*.c 把 extend 下所有的 .c 檔案全
部編譯
[user]# arm-linux-gcc --shared -o libttf.so *.o 生成最後的動態連結庫,OK 了
現在手動安裝,得自己建立一下目錄
[Root] mkdir –p /usr/local/arm/2.95.3/arm-linux/include/freetype1/freetype
[Root] cp
*.h extend/*.h /usr/local/arm/2.95.3/arm-linux/include/freetype1/freetype
[Root] cp libttf.so /usr/local/arm/2.95.3/arm-linux/lib
安裝庫完成,哈!
經過試驗發現 MiniGUI 1.3.3 版本在連結 ljpeg lpng lttf 時老是要連結 /usr/lib 下的庫,
沒辦法,用老方法
[Root]# cd /usr/lib
[Root]# mv libjpeg.so libjpeg.so_back
[Root]# ln –s /usr/local/arm/2.95.3/arm-linux/lib/libjpeg.so ./libjpeg.so //指向
arm 的庫
[Root]# mv libpng.so libpng.so_back
[Root]# ln –s /usr/local/arm/2.95.3/arm-linux/lib/libpng.so ./libpng.so
[Root]# mv libttf.so libttf.so_back
[Root]# ln –s /usr/local/arm/2.95.3/arm-linux/lib/libttf.so ./libttf.so
完成以上工作後就可以編譯 libminigui 了
[user]# cd libminigui-1.3.3
[user]# make menuconfig //就用圖形介面來配置就好了,不要用一堆
–enable-xxx 之類的,太麻煩
如果在 make menuconfig 出錯,去檢查一下你的 gcc ,前面我們把它指向 arm-linux-gcc ,
問一下,你改回來沒有???????
下面是配置libminigui
在 System Wide Options 裡如下:
Build MiniGUI-Lite //選中 用 Lite 方式編譯,不是Thread 方式,這裡適用於 PDA
[ ] Stand-Alone    //不選
[ ] Use incore (built-in) resource //建議不要選這個,老有問題
Unit of timer is 10ms
Cursor support
[ ] User can move window with mouse //建議別選這個,可以移動蠻煩人的
Mouse button can do double click
Build with debugging messages
[ ] Trace messages of MiniGUI //不要選這個,出來的Trace 太多,看不過來
Include symbol name of messages
在 GAL engine Options 裡
(NEWGAL) GAL and its engines
NEWGAL engine on Linux FrameBuffer console
[ ] NEWGAL engine on Qt Virtual FrameBuffer //建議不要選這個,不然老讓你用qvfb
[ ] NEWGAL engine on eCos LCD interface
Dummy NEWGAL engine
Have console on Linux FrameBuffer
在 IAL engine options 裡
[ ] EP7211-based board
[ ] ADS Graphics Client
[ ] iPAQ H3600 (also H3800)
[ ] MPC823
[ ] PX255B
[ ] NEC VR4181
[ ] Helio Touch Panel
[ ] MT T800
SMDK2410 Touch Screen
[ ] uClinux Touch Screen Palm/MC68EZ328
Dummy IAL engine
Native (console) input engine
--- Native IAL engine subdriver options
[ ] PS2 mouse
[ ] IntelligentMouse (IMPS/2) mouse
[ ] MS mouse
[ ] MS3 mouse
GPM daemon
在 Font Option 裡
Raw bitmap font
[ ] Var bitmap font //千萬不要選這個,不然會出現 unreferenced vfb_Courier8x8() 之
類的錯誤
Incore font sansserif
Incore font courier
Incore font symbol
Incore font vgas
Qt Prerendered Font
TrueType font
[ ] Adobe Type1 font
在 Image Options 裡
Includes SaveBitmap-related functions
[ ] PCX file support
[ ] LBM/PBM file support
[ ] TGA file support
GIF file support
JPG file support
PNG file support
在 Input Medthold Option 裡
IME (GB2312) support
[ ] IME (GB2312) Intelligent Pinyin module //千萬不要選這個,不然後面你的 mginit 程
序一啟動就崩潰了(Abort ,有點像 OOP 一樣,顯示所有的暫存器的值,然後Abort),暴不

在 Development Environment Option 裡
(Linux) Platform
(arm-linux-gcc) Compiler //注意這裡
(glibc) Libc //注意這裡
--- Installation options
Path prefix: "/usr/local/arm/2.95.3/arm-linux" //注意這裡,我們把庫裝到交叉編譯器
的目錄下
--- Additonal Compiler Flags
CFLAGS: ""
LDFLAGS: ""
其它的用預設的選項就可以了,好了,現在退出,儲存你的設定吧,然後它就開始檢測你的系統
了,注意下面的輸出:
checking for FrameBuffer console support... yes
checking for TT_FreeType_Version in -lttf... yes //True Type 字型
checking for jpeg_std_error in -ljpeg... yes // jpeg 支援
checking for png_check_sig in -lpng... yes //png 圖形支援,重要!!!
checking for pow in -lm... yes
這裡的庫應該都是顯示為 yes 了,如果有 no 的話,回去檢查前面你有哪步做得不對,不然的
話編譯後的東西可能沒法正常執行,切記切記!!!
如果這裡通過了,那就OK 了
[user]# make //又是一個漫長的等待,呵
[Root]# make install
注意:我們這裡 make install 其實是給交叉編譯器安裝 libminigui 的庫,你想,將來你需要
編譯為 minigui 開發的程式,這個程式總是需要連結庫的吧,這些庫因此也需要在交叉編譯器
中,不然你交叉編譯的時候編譯不過去 :)
裝好了,到 /usr/local/arm/2.95.3/arm-linux 的 include lib 目錄下去看看,是不是多了
相應的 libminigui.so libmgext.so libvcongui.so 在 include 目錄下多了一個
minigui 目錄,裡面有相應的標頭檔案、


最後,安裝 popt 庫,這個庫在編譯 mde 程式時需要使用,不然編譯沒法通過 :)
http://gd.tuwien.ac.at/utils/rpm.org/dist/rpm-4.1.x/popt-1.7.tar.gz 我是從這裡下
載的
[user]# tar zxf popt-1.7.tar.gz
[user]# cd popt-1.7
[user]# ./configure --prefix=/usr/local/arm/2.95.3/arm-linux/ --host=arm-linux
--enable-shared --enable-static
[user]# make
[Root]# make install
一切很順利,搞定了。
交叉編譯環境設定好了!


3.下面是把 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 libvcong
ui-1.3.so.3 libz.so.1.2.3
libjpeg.so.62 libmgext.la libm.so libpopt.la libvcon
gui-1.3.so.3.0.0 minigui
libjpeg.so.62.0.0 libmgext.so libm.so.6 libpopt.so libvco
ngui.a shared
libm-2.2.3.so libminigui-1.3.so.3 libpng.a libpopt.so.0 libvcon
gui.la
libm.a libminigui-1.3.so.3.0.0 libpng.so libpopt.so.0.0.0 libvco
ngui.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 <stdio.h>
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
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;
Generated by Foxit PDF Creator © Foxit Software
http://www.foxitsoftware.com For evaluation only.
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 <minigui/dti.c>
#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 程式? 看
前面說的方法

問題6:編譯libminigui是出錯

資訊如下:
/usr/local/arm/2.95.3/arm-linux/bin/ld: template.lo: Relocations in generic ELF
(EM: 3)
template.lo: could not read symbols: File in wrong format
collect2: ld returned 1 exit status
make[3]: *** [libminigui.la] Error 1
make[3]: Leaving directory `/home/minigui/s3c2440/libminigui-1.3.3/src'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/home/minigui/s3c2440/libminigui-1.3.3/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/minigui/s3c2440/libminigui-1.3.3'
make: *** [all] Error 2

解決:這是編譯器包出來的,是不認識template.lo的格式。這種情況下。要make clean,在Linux下對檔案有許可權管理,要看一看你是否有刪除這檔案的許可權。要確認已經將其刪除。然後再make和make install 就可以解決上面的問題了


好了,就寫這麼多吧,希望對新手有所幫助!

相關推薦

MiniGUI 移植pcarm開發全過程 錯誤解答

最近移植了 MiniGUI 1.3.3 到一個開發板上,中間遇到許多問題,在論壇上發問題,結果也沒多少人回我,就算偶爾有回的,基本上回答也沒有什麼用,網上找不到一個完整的移植文章,所以就決定把自己這次移植摸出來的一些方法寫出來,給像我一樣的小菜鳥做個參考吧。本文不教你怎麼寫驅

openssl移植arm開發全過程

1.交叉編譯參考了:我的makefile修改完如下:#CC=gccCC=armv6zk-none-linux-gnueabi-gccCFLAG= -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS-D_REENTRANT -DDSO_DLFCN -DH

Linux PCARM版的QT環境設定ARM移植&常見錯誤解決方法

* *********安裝前,系統更新,能夠減少未知情況出現 1 PC版本 http://blog.csdn.net/chchchdx123/article/details/6911267 在終端中輸入:sudo apt-get install qt4-dev-t

利用secureCRT在windowsarm開發之間傳輸檔案的方法

1.windows傳給arm開發板 ①在secureCRT中進入你要存放檔案的目錄,比如home目錄,在secureCRT輸入cd /home ②在secureCRT中輸入rz,彈出對話方塊,選擇你要傳輸的檔案,點Add,點ok ③傳輸完成,在開發板的home目錄下就有了傳輸來的檔案了 2.開發板傳給win

移植madplay到arm開發

這篇文章寫的很全,沒什麼好改的了。 按照上面做肯定能成功的,但是要注意目錄的問題,記得自已的目錄別搞錯了。 <--! 強烈建議不要在虛擬機器掛接Windows共享目錄下進行編譯 --> 1.配置編譯環境     首先,將要使用的交叉編譯器設為預設交

gdbarm-linux-gdb命令

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

[資料分享]迅為4412開發介面(一)

開發板平臺簡要介紹 核心板 Exynos4412有兩種封裝形式, 其中POP封裝的晶片內含1GB記憶體, 所以不需要外擴DDR, 可大大節省 PCB 面積,功耗控制方面也更好,多用於手持裝置當中; SCP 封裝優點是記憶體擴 展更靈活,生產工藝相對更容易控制。 電源晶片 S

[資料分享]迅為4412開發介面(二)

Exynos4412有兩種封裝形式, 其中POP封裝的晶片內含1GB記憶體, 所以不需要外擴DDR, 可大大節省 PCB 面積,功耗控制方面也更好,多用於手持裝置當中; SCP 封裝優點是記憶體擴 展更靈活,生產工藝相對更容易控制。 介面詳解(一): SIM 卡 S

【資源分享】迅為 iTOP-4412開發平臺

開發板是一個相對複雜的電子系統,請耐心按照本章說明組裝,以免造成不必要的損失。 使用者最好使用迅為提供的連線線,因為有些部件是專門定製的,可能和市場上購買的其它 連線線和部件不匹配,擅自使用市場上購買的接線或者部件可能損傷開發板。 在完全弄清楚開發板介面訊號定義之前,如果本

在linux中把彙編或c程式交叉編譯成二進位制檔案燒錄開發過程

嵌入式開發中在宿主機中要編譯能在目標機中執行的程式檔案需要用到一種工具:交叉工具鏈。其中我們常用的交叉工具有以下幾種:交叉編譯器,交叉聯結器,交叉轉換器,交叉ELF檔案工具,交叉反彙編器。以下通過例項將這些做一些介紹。 分解以下講一個led.S檔案編譯成可燒錄的二進位制檔案

微信支付寶支付模式實現二

配置 其余 logs https 朋友 一個 target 多租戶 對比   繼上篇《微信和支付寶支付模式詳解及實現》到現在已經有半年時間了,這期間不少朋友在公號留言支付相關的問題,最近正好也在處理公司支付相關的對接,打算寫這篇來做一個更進一步的介紹,同時根據主要的幾個支付

Android 註解開發 ButterKnife使用教程

**俗話說:“不會偷懶的程式設計師不是好的程式設計師!”。作為一名Android開發,是不是經常厭煩了大量的findViewById以及setOnClickListener程式碼,而ButterKnife是一個專注於Android系統的View注入框架,讓你從此

微信支付寶支付模式實現(.Net標準庫)

     支付基本上是很多產品都必須的一個模組,大家最熟悉的應該就是微信和支付寶支付了,不過更多的可能還是停留在直接sdk的呼叫上,甚至和業務系統高度耦合,網上也存在各種解決方案,但大多形式各異,東拼西湊而成。所以這裡我介紹下OSS.PayCenter開源跨平臺支付元件 及

Android檔案儲存的問題:ClassLoader實現Parcelable介面後 用途

可能小夥伴們讀了我上一篇部落格關於Android檔案儲存的的,在檔案操作的時候大家有沒有疑問呀,有就對了,可能在儲存自定義物件的時候,如何序列化呀?ClassLoader到底是啥鬼呀?序列化後怎麼讀取出來呀?好吧,針對於上面的問題,我一個一個的說明吧! 今天主

Jvm堆記憶體的劃分結構優化,垃圾回收(詳細解答篇)

1.S0與S1的區間明顯較小,有效新生代空間為Eden+S0/S1,因此有效空間就大,增加了記憶體使用率 2.有利於物件代的計算,當一個物件在S0/S1中達到設定的XX:MaxTenuringThreshold值後,會將其分到老年代中,設想一下,如果沒有S0/S1,直接分成兩個區,該如何計算物件經過了多少次G

getClass()getClassLoader()區別 以及ClassLoader用途(檔案載入,類載入)

 1.1 幾個相關概念ClassLoader負責載入系統的所有Resources(Class,檔案,來自網路的位元組流等),通過ClassLoader從而將資源載入JVM   每個class都有一個reference,指向自己的ClassLoader。Class.getClassLoader()   arra

將lrzsz工具移植ARM開發 ---只通過串列埠實現windowARM之間檔案互傳

事情背景:由於需要在windows和ARM板之間只通過串列埠傳輸檔案(windows的檔案只通過串列埠傳輸到ARM板上) 這時超級終端SecureCRT+lrzsz工具可以完成這項使命!(其他終端軟體

pythonjson 移植ARM開發

下載移植包:http://download.csdn.net/detail/lyh2529/72389411.將bin12.02.tar傳送到arm板上,並將其解壓到arm板上作業系統的bin目錄下,命令為:tar -xvf bin12.02.tar -C /2.將lib12.02.tar傳送到arm板上,並

移植wpa_supplicant2.5到arm開發

this func gnu error netlink eabi err erro arm-linux 編譯libnl1-1: ./configure --host=arm-linux --enable-static --prefix=/usr/local/ssl CC

Ubuntu16.04NFS配置與ARM開發互傳文件_掛載卸載

分享 all http ini mnt 文件夾 linux系統 don lin 第一步:安裝NFS服務 sudo apt-get install nfs-kernel-server portmap 第二步:增加NFS配置文件 sudo vim /etc/exports 在v