本次实验分两步走:
- 先在虚拟机上编译安装好
minigui
能够在虚拟机上看到实验现象(显示Hello World)。 - 移植到开发板上,在开发板上可以看到实验现象。
实验所用到的包可在此下载
链接: https://pan.baidu.com/s/16vRq2C9BM5gj2rYHvgBhbw
提取码: t72u
Ⅰ. 虚拟机安装 minigui
如果安装 red hat
的时候选的是 everything
的话,是不需要安装这几个库 zlib, png, jpeg, ttf
只有移植到开发板上才需要。
所以在虚拟机上我们只需要以下三个包就可以了。
libminigui
minigui-res
qvfb
mde-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
需要的包如下:
libminigui
minigui-res
qvfb
mde-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
cp libttf.so /usr/local/arm/2.95.3/arm-linux/lib -rf
到这里,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