JXARM9-2410-3实验三

20 篇文章 6 订阅

本次实验分两步走:

  1. 先在虚拟机上编译安装好 minigui 能够在虚拟机上看到实验现象(显示Hello World)。
  2. 移植到开发板上,在开发板上可以看到实验现象。

实验所用到的包可在此下载

链接: 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

Ⅲ. 参考文章

  1. MiniGUI 移植到pc和arm开发板全过程详解 及错误解答
  2. ubuntu下JPEG的交叉编译
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值