本次實驗分兩步走:
- 先在虛擬機上編譯安裝好
minigui能夠在虛擬機上看到實驗現象(顯示Hello World), - 移植到開發板上,在開發板上可以看到實驗現象,
Ⅰ. 虛擬機安裝 minigui
如果安裝 red hat 的時候選的是 everything 的話,是不需要安裝這幾個庫 zlib, png, jpeg, ttf 只有移植到開發板上才需要,
所以在虛擬機上我們只需要以下三個包就可以了,
libminiguiminigui-resqvfbmde-1.6.10例子程式mg-samples-1.6.10例子程式
1. 安裝資源
cd /home/minigui
tar -zxvf minigui-res-1.6.10.tar.gz
cd minigui-res-1.6.10
make install
如果沒有出現任何報錯資訊,說明資源安裝成功了,安裝默認路徑 /usr/local/lib 如果有 minigui/res 這個目錄,資源檔案安裝成功,
2. 編譯安裝 libminigui
cd /home/minigui
tar -zxvf libminigui-1.6.10.tar.gz
cd libminigui-1.6.10
./configure # 默認安裝即可
這里留意下終端資訊:

紅框框內的后面的字必須是 yes 不然后面程式會有問題的,
make && make install
# 等待安裝完畢即可
現在 minigui 已經全部安裝成功了,可以去 /usr/local/lib 目錄下檢查下是不是有一堆 .so 的動態庫,

3. 修改組態檔
如果程式當前路徑有 MiniGUI.cfg 這個檔案,就會使用當前路徑下的這個檔案,如果沒有,回到默認路徑 /usr/local/etc 目錄下尋找這個檔案,
我們更改 MiniGUI.cfg 檔案如下:

紅色圈圈的表示我注釋掉的內容(不用管),紅色圈圈的就是添加的內容(自己手動添加進去即可),
注:在添加這個 defaultmode 的時候,我們不要手打,直接 Shift + v 復制一行,p 粘貼,或者直接在原有的基礎上改,因為這個 × 符號貌似打不出來,
4. 添加庫進 /etc/ld.so.conf
只有把剛剛的動態庫,添加到這個里面,才能找的到,
當然,也還有其他辦法,可以參考:簡簡單單學會寫makefile
vim /etc/ld.so.conf
# 按G跳到最后一行,O在一行插入 插入如下內容
/usr/local/lib
5. 安裝 qvfb
即 qt virtual framebuffer 是為QT提供的一個虛擬framebuffer的應用程式,實作對qt的應用程式提供一個模擬的嵌入式設備,可直接看到程式在“實際”設備中的運行情況,
cd /home/minigui
tar -zxvf qvfb-1.1.tar.gz
cd qvfb-1.1
./configure
make && make install
如果報錯,說明少了包,google搜索下就好了,
到目前為止,red hat 上的 minigui 已經安裝完成了,
6. 測驗
跑一個掃雷程式測驗下,
cd /home/minigui
tar -zxvf mde-1.6.10.tar.gz
cd mde-1.6.10
./configure
make && make install
啟動 qvfb 一定要先啟動 qvfb !
qvfb &
# 不占用終端
這個時候會彈出一個視窗,點擊 File->configure 設定視窗大小,即剛剛在 MiniGUI.cfg 設定的 800×600 色深為 16位,

接下來把這個視窗拉小一點,不然看不到保存的按鈕,

點擊 OK 即可,
cd bomb
./bomb
然后打開 qvfb 即可看到掃雷程式了,

至此,虛擬機上的 minigui 可以正常運行了,如果虛擬機上可以正常運行,那么移植到開發板上也基本上沒什么問題的,
Ⅱ. 移植minigui
需要的包如下:
libminiguiminigui-resqvfbmde-1.6.10例子程式mg-samples-1.6.10例子程式zlib庫png庫jpeg庫libttf庫
交叉編譯器就不介紹怎么安裝了,這里用的是 cross-2.95.3 可以參考 安裝交叉編譯器 原理都是一樣的,
1. 安裝 zlib 庫
cd /home/migigui
tar -zxvf zlib-1.2.2.tar.gz
cd zlib-1.2.2
zlib 庫的 configure 不支持交叉編譯選項,采取“曲線救國”策略,

cd /usr/bin
mv gcc gcc_back
ln -s /usr/local/arm/2.95.3/bin/arm-linux-gcc ./gcc
mv ld ld_back
ln -s /usr/local/arm/2.95.3/bin/arm-linux-ld ./ld
切換回 zlib 目錄
cd /home/minigui/zlib-1.2.2
./configure --prefix=/usr/local/arm/2.95.3/arm-linux/ --shared
make && make install
這里會看到用 gcc 編譯庫,沒事,因為之前我們把 gcc 改成 arm-linux-gcc 的軟連接了,
去 /usr/local/arm/2.95.3/arm-linux/ 目錄下查看下有沒有 zlib 的庫,
cd /usr/local/arm/2.95.3/arm-linux/
find . -name *zlib*
# ./include/zlib.h
# ./share/man/man3/zlib.3
find . -name *libz*
# ./lib/libz.so.1.2.2
# ./lib/libz.so
# ./lib/libz.so.1
有這幾個確定就沒問題了,利用 file 查看下是不是ARM平臺的,
file ./lib/libz.so.1.2.2
# ./lib/libz.so.1.2.2: ELF 32-bit LSB shared object, ARM, version 1 (ARM), not stripped
現在把 gcc ld 改回去,
先洗掉軟連接,再改名,
cd /usr/bin
ls -lrt gcc
# lrwxrwxrwx 1 root root 39 11? 8 05:40 gcc -> /usr/local/arm/2.95.3/bin/arm-linux-gcc
rm -rf gcc
mv gcc_back gcc
ls -lrt ld
# lrwxrwxrwx 1 root root 38 11? 8 05:40 ld -> /usr/local/arm/2.95.3/bin/arm-linux-ld
rm -rf ld
mv ld_back ld
看下是否成功,
gcc -v
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --host=i386-redhat-linux
Thread model: posix
gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5)
ld -v
GNU ld version 2.13.90.0.18 20030206
到這里,zlib 庫就編譯安裝成功了,
2. 安裝 png 庫
cd /home/migigui
tar -zxvf libpng-1.0.69.tar.gz
cd libpng-1.0.69
CC=/usr/local/arm/2.95.3/bin/arm-linux-gcc ./configure --prefix=/usr/local/arm/2.95.3/arm-linux/ --build=i386-linux --host=arm-unknown-linux --target=arm-unknown-linux
make && make install
如果報錯,請先安裝 zlib 庫,
去檢查下是否安裝成功,
cd /usr/local/arm/2.95.3/arm-linux/
find . -name *png*
./include/libpng10
./include/libpng10/png.h
./include/libpng10/pngconf.h
./include/png.h
./include/pngconf.h
./bin/libpng10-config
./bin/libpng-config
./lib/libpng10.so.0.69.0
./lib/libpng10.so.0
./lib/libpng10.so
./lib/libpng10.la
./lib/libpng.so.2.69.0
./lib/libpng.so.2
./lib/libpng.so
./lib/libpng.la
./lib/libpng10.a
./lib/libpng.a
./lib/pkgconfig/libpng10.pc
./lib/pkgconfig/libpng.pc
./share/man/man3/libpng.3
./share/man/man3/libpngpf.3
./share/man/man5/png.5
查看是不是ARM平臺的庫,
file ./lib/libpng10.so.0.69.0
./lib/libpng10.so.0.69.0: ELF 32-bit LSB shared object, ARM, version 1 (ARM), not stripped
到這里 png 庫就安裝成功了,
3. 安裝 jpeg 庫
這個版本的 jpeg 庫沒有提供 libtool 庫,所以要先編譯 libtool 庫,
cd /home/minigui
tar -zxvf libtool-2.4.tar.gz
cd libtool-2.4
./configure CC=arm-linux-gcc --build=i386-linux --host=arm-linux --prefix=$PWD/_install
make && make install
現在把 _install/bin 的內容復制到 ljpeg-6b 目錄下,
cd ..
tar -zxvf jpegsrc.v6b.tar.gz
cd jpeg-6b
mv ../libtool-2.4/_install/bin/* .
# 需要自己手動創建一個目錄,不然會報錯
mkdir –p /usr/local/arm/2.95.3/arm-linux/man/man1
./configure --prefix=/usr/local/arm/2.95.3/arm-linux/ CC=arm-linux-gcc --enable-shared --enable-static
make && make install
檢查是否安裝成功,
cd /usr/local/arm/2.95.3/arm-linux/
find . -name *jpeg*
./include/jpeglib.h
./bin/cjpeg
./bin/djpeg
./bin/jpegtran
./lib/libjpeg.so.62.0.0
./lib/libjpeg.so.62
./lib/libjpeg.so
./lib/libjpeg.la
./lib/libjpeg.a
./man/man1/cjpeg.1
./man/man1/djpeg.1
./man/man1/jpegtran.1
查看是不是ARM平臺的,
file ./lib/libjpeg.so.62.0.0
./lib/libjpeg.so.62.0.0: ELF 32-bit LSB shared object, ARM, version 1 (ARM), not stripped
到這里,jpeg 庫也安裝成功了,
4. 安裝 libttf 庫
minigui 只支持1.3.1的 ttf 庫,這個庫最麻煩,
cd /home/minigui
tar -zxvf freetype-1.3.1.tar.gz
mkdir -p libttf/extend
cp freetype-1.3.1/lib/* freetype-1.3.1/lib/arch/ansi/* libttf/
# 這里不用加-r,有幾個不需要用
cp freetype-1.3.1/lib/extend/* libttf/extend
cd libttf
arm-linux-gcc -c -fPIC -O2 freetype.c
arm-linux-gcc -c -fPIC -O2 -I./ extend/*.c
arm-linux-gcc --shared -o libttf.so *.o
mkdir –p /usr/local/arm/2.95.3/arm-linux/include/freetype1/freetype
cp *.h extend/*.h /usr/local/arm/2.95.3/arm-linux/include/freetype1/freetype
到這里,libttf 庫也安裝成功了,
5. 安裝libminigui-1.6.10
cd /home/minigui
cd libminigui-1.6.10
CC=/usr/local/arm/2.95.3/bin/arm-linux-gcc ./configure --prefix=/usr/local/arm/2.95.3/arm-linux/ --build=i386-linux --host=arm-unknown-linux --target=arm-unknown-linux
make && make install
到這里,libminigui-1.6.10 就安裝成功了,
6. 安裝資源
cd /home/minigui
cd minigui-res-1.6.10
vim config.linux
# /cc 查找cc改為/usr/local/arm/2.95.3/bin/arm-linux-gcc
# /prefix 查找prefix改為/usr/local/arm/2.95.3/arm-linux
make install
資源也安裝成功了,
7. 測驗
試試能不能成功編譯代碼,
helloworld.c 代碼
#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, 60, 60, "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 _MGRM_PROCESSES
JoinLayer (NAME_DEF_LAYER , "helloworld" , 0 , 0);
#endif
CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;
CreateInfo.dwExStyle = WS_EX_NONE;
CreateInfo.spCaption = "HelloWorld";
CreateInfo.hMenu = 0;
CreateInfo.hCursor = GetSystemCursor (0);
CreateInfo.hIcon = 0;
CreateInfo.MainWindowProc = HelloWinProc;
CreateInfo.lx = 0;
CreateInfo.ty = 0;
CreateInfo.rx = 240;
CreateInfo.by = 180;
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 _MGRM_PROCESSES
#include <minigui/dti.c>
#endif
編譯
arm-linux-gcc -o helloworld helloworld.c -lminigui -lpthread -ljpeg -lpng –lttf
查看是不是ARM平臺的,
file helloworld
helloworld: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.0.0, dynamically linked (uses shared libs), not stripped
這樣我們就可以在宿主機上編譯 minigui 代碼了,把這個可執行檔案放到移植了 minigui 的開發板上就可以跑了,
注:如果當前目錄下有 MiniGUI.cf 還需要更改這個檔案,我這里的改法是基于 JXARM9-2410 的,

這里的 ial_engine 要改為 SMDK2410 fbcon 大小要改為 640×480,不然會報錯的,
如果當前目錄下沒有,前面講過了,就會到 /usr/local/etc 默認目錄下尋找這個檔案,
如果出現這個錯誤 GAL ENGINE: Can't open /dev/tty0: No such file or directory 等跟設備有關的錯誤
試試這個 mknod /dev/tty0 c 4 0
Ⅲ. 參考文章
- MiniGUI 移植到pc和arm開發板全程序詳解 及錯誤解答
- ubuntu下JPEG的交叉編譯
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/209075.html
標籤:其他
上一篇:使用HAProxy+Nginx搭建web集群 ———— Keepalived實作高可用負載均衡
下一篇:再說linux命令列的管道
