想好好學學編程基礎,先前安裝了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編譯
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了。也該睡覺了,晚安阿!