Ubuntu移植MiniGUI

1 库文件下载

minigui3.0.12文件下载

iphone-like-demo-1.0.0.tar.gz
libminigui-gpl-3.0.12.tar.gz			minigui核心库文件
mg-samples-3.0.12.tar.gz			minigui例子文件
minigui-res-be-3.0.12.tar.gz			minigui资源文件
libmgplus-1.2.4.tar.gz				minigui高级图形功能
libmgi-2.0.4.tar.gz				minigui的输入法
zlib-1.2.2.tar.gz
jpegsrc.v7.tar.gz
libpng-1.2.37.tar.gz
freetype-2.3.9-fm20100818.tar.gz

环境

Ubuntu 14.04.5 LTS 64位
MiniGui3.0.12
Qt-3.3.0

2 lib安装

首先安装编译32位程序的库,因为minigui编译成32位程序比较容易,如果编译换成64位程序,会有很多错误需要修改,安装之前,建议先把本文看完

sudo apt-get install g++-multilib ia32-libs libc6-dev-i386 linux32

可能有些库没有,但是控制台会提示替代能替代的库,安装就好
libpnglibjpegzlibfreetype这四个库都是解压后执行下面的命令,安装到/usr/local/lib

CC="gcc -m32" ./configure
make
sudo make install

3 qvfb安装

安装依赖的第三方库

sudo apt-get install libx11-dev libxext-dev libxtst-dev

这些也安装好

sudo apt-get install build-essential subversion git-core libncurses5-dev \
	zlib1g-dev gawk flex quilt libssl-dev xsltproc libxml-parser-perl \
	mercurial bzr ecj cvs unzip ia32-libs

3.1 qt-4.8.6

不需要安装qt-4.8.6,此处记录我艰难的安装过程,直接安装qt-3.3.0即可。
qt-4.8.6下载
选择文件qt-everywhere-opensource-src-4.8.6.tar.gz,解压并进入文件夹,安装到/home/anruliu/software/qt-4.8.6这个文件夹下

CC="gcc -m32" CXX="g++ -m32" ./configure -opensource -prefix /home/anruliu/software/qt-4.8.6

CC=“gcc -m32” CXX="g++ -m32"是编译成32位的,实际上不需要编译成32位程序,去掉即可,之后出现开源许可,输入yes接受,通过库文件检查之后输入

make && make install

编译通过,安装完成后,需要将qt的库和可执行文件路径配置到环境变量中,否则在安装qvfb时会报错

sudo gedit ~/.bashrc

在文件最后面后面加上

export PATH=/home/anruliu/software/qt-4.8.6/bin:$PATH

使环境变量生效

source ~/.bashrc

进入qt4.8.6源码目录下的tools/qvfb,执行qmake命令

qmake

如果出现错误找不到qmake命令,则是因为环境变量配置没有生效,生效之后报错看下面的错误,qmake执行成功,执行make命令,开始编译,编译前可以在/tools/qvfb/main.cpp中更改widthheightdepth的值

make

编译成功后,将源码目录bin下的qvfb文件拷贝到qt安装目录bin下,双击qvfb就可以运行,也可以在bin目录下执行

./qvfb

qvfb安装成功。在需要使用minigui前,先打开qvfb模拟工具,让其在后台运行,这样minigui的界面就可以正常运行了。
qvfb运行画面
错误

qmake: could not exec '/usr/lib/x86_64-linux-gnu/qt4/bin/qmake': No such file or directory

解决

sudo gedit /usr/lib/x86_64-linux-gnu/qt-default/qtchooser/default.conf

/usr/lib/x86_64-linux-gnu/qt4/bin 改为 /home/anruliu/software/qt-4.8.6/bin

错误

undefined reference to `png_create_write_struct'
undefined reference to `png_create_info_struct'
undefined reference to `png_set_compression_level'
undefined reference to `png_set_write_fn'

解决
打开/tools/qvfb/Makefile文件,找到LIBS变量,增加 -L/usr/local/lib -lpng

错误

/usr/bin/ld: skipping incompatible /home/anruliu/workspace/minigui/qt-everywhere-opensource-src-4.8.6/src/tools/bootstrap/libbootstrap.a when searching for -lbootstrap
/usr/bin/ld: cannot find -lbootstrap

解决
打开/src/tools目录下的idc,moc,rcc,uic,uic3文件夹里面的Makefile文件,把LINK=g++改为LINK=g++ -m32
打开/src目录下的corelib、xml、network、sql、testlib、gui、qt3support、xmlpatterns、multimedia、svg、script、declarative、scripttools、plugins、imports的Makefile文件也修改,其中plugins和imports的子目录下也有很多Makefile,注意不要漏了。还有很多很多处需要修改,根据出错的路径更改即可!!!
因为CC和CXX在./configure的时候都改成-m32的了,所以LINK也要改。谁有更好修改LINK的方法请告诉我,感激不尽!!!要改那么多…手都快改肿了。

错误

/usr/include/openssl/e_os2.h:56:33: fatal error: openssl/opensslconf.h: No such file or directory

解决
将/usr/include/x86_64-linux-gnu/openssl/opensslconf.h复制到/usr/include/openssl目录下

错误

/usr/bin/ld: <font color=red>cannot find -lX11</font>
/usr/bin/ld: <font color=red>cannot find -lXtst</font>
/usr/bin/ld: <font color=red>cannot find -lXext</font>

解决
lX11与lXtst没有安装,安装即可

sudo apt-get install libx11-dev:i386
sudo apt-get install libxtst-dev:i386

使用命令查看lXext有没有安装

locate Xext
/usr/include/X11/extensions/Xext.h
/usr/lib/i386-linux-gnu/libXext.so.6
/usr/lib/i386-linux-gnu/libXext.so.6.4.0
/usr/lib/x86_64-linux-gnu/libXext.a
/usr/lib/x86_64-linux-gnu/libXext.so
/usr/lib/x86_64-linux-gnu/libXext.so.6
/usr/lib/x86_64-linux-gnu/libXext.so.6.4.0

发现在/usr/lib/i386-linux-gnu/有libXext库,但是没有链接,制作链接即可,进入这个目录执行

sudo ln -s libXext.so.6 libXext.so

3.2 qt-3.3.0

qt-3.3.0下载
qt-3.3.0下载
选择文件qt-x11-free-3.3.0.tar.gz,解压并进入文件夹,安装到/home/anruliu/software/qt-3.3.0这个文件夹下

./configure -prefix /home/anruliu/software/qt-3.3.0

之后出现开源许可,输入yes接受,通过库文件检查之后输入

make && make install

编译通过,安装完成后,需要将qt的库和可执行文件路径配置到环境变量中,否则在安装qvfb时会报错

sudo gedit ~/.bashrc

在文件最后面后面加上

export PATH=/home/anruliu/software/qt-3.3.0/bin:$PATH

使环境变量生效

source ~/.bashrc

进入qt3.3.0源码目录下的tools/qvfb,执行qmake命令

qmake

如果出现错误找不到qmake命令,则是因为环境变量配置没有生效,生效之后报错看下面的错误,qmake执行成功,执行make命令,开始编译,编译前可以在/tools/qvfb/main.cpp中更改widthheightdepth的值,我改的值是

int width = 800;
int height = 480;
int depth = 32;
make

编译成功后,将源码目录bin下的qvfb文件拷贝到qt安装目录bin下,双击qvfb就可以运行,也可以在bin目录下执行

./qvfb

qvfb安装成功。在需要使用minigui前,先打开qvfb模拟工具,让其在后台运行,这样minigui的界面就可以正常运行了。
qvfb运行成功截图
错误

../include/qvaluelist.h:88:13: error: ‘ptrdiff_t’ does not name a type
typedef ptrdiff_t  difference_type;

解决
打开/include/qvaluelist.h与qmap.h,在最上面加入#include <cstddef>

错误

error while loading shared libraries: libqt.so.3: cannot open shared object file: No such file or directory

解决
把这库路径添加到环境变量中

export LD_LIBRARY_PATH='/home/anruliu/workspace/minigui/qt-x11-free-3.3.0/lib'

错误

qvfbview.cpp: In constructor ‘QVFbView::QVFbView(int, int, int, int, QWidget*, const char*, uint)’:
qvfbview.cpp:118:15: error: cast from ‘unsigned char*’ to ‘int’ loses precision [-fpermissive]
if ( (int)data == -1 )

解决
打开/tools/qvfb/qvfbview.cpp
把if ( (int)data == -1 )改为if ( (long)data == -1 )
如果还遇到其他编译错误,请查看本文上一小节qt-4.8.6编译问题记录

4 minigui安装

4.1 minigui-res-be-3.0.12

进入到解压目录

CC="gcc -m32" ./configure
make
sudo make install

4.2 libminigui-gpl–3.0.12

进入到解压目录,注意-m32,把这个库编成32位的,不然之后会遇到很多错误的!!还有–enable-qvfbial–enable-videoqvfb,表示启用qvfb功能!!如果加上–enable-pngsupport --enable-jpgsupport表示支持png与jpeg,要显示飞漫公司启动动画则要加上png与jpeg支持,–disable-splash --disable-screensaver不显示飞漫公司的启动动画

CC="gcc -m32 -fgnu89-inline" ./configure --enable-qvfbial --enable-videoqvfb \
	--disable-splash --disable-screensaver --enable-pngsupport \
	--enable-jpgsupport --with-ttfsupport=ft2 --with-ft2-includes=/usr/local/include/freetype2
make
sudo make install

错误

object.h: In function 'MGGET_ARG_COUNT':
object.h:275: error: incompatible types when assigning to type 'va_list' from type 'struct __va_list_tag *'

解决
va 作为函数参数的时候会转换成指针类型,而_va.va是数组类型 所以报类型不匹配错误。打开/libminigui-gpl-3.0.12/src/textedit/object.h

 // _va.va = va;
 va_copy(_va.va, va);

错误

/usr/local/lib/libminigui_ths.so: undefined reference to 'WndClientRect'
/usr/local/lib/libminigui_ths.so: undefined reference to `WndRect'

解决
配置的时候指定-fgnu89-inline

CC="gcc -m32 -fgnu89-inline"

4.3 libmgplus-1.2.4

进入到解压目录

CC="gcc -m32" CXX="g++ -m32" ./configure
make
sudo make install

错误

lf_fashion.cpp: In function 'void draw_fold(HWND, HDC, const RECT*, DWORD, int, int)':
lf_fashion.cpp:1261:106: error: cast from 'const BITMAP* {aka const _BITMAP*}' to 'HICON {aka unsigned int}' loses precision [-fpermissive]
         HICON hFoldIcon   = (HICON)RetrieveRes (gui_GetIconFile("skin", (char*)SYSICON_TREEFOLD, szValue));
lf_fashion.cpp:1262:108: error: cast from 'const BITMAP* {aka const _BITMAP*}' to 'HICON {aka unsigned int}' loses precision [-fpermissive]
         HICON hUnFoldIcon = (HICON)RetrieveRes (gui_GetIconFile("skin", (char*)SYSICON_TREEUNFOLD, szValue));

解决
这主要是64位机上编译32位的问题,打开/libminigui-gpl-3.0.12/include/common.h
typedef unsigned int HICON 改为 typedef unsigned long HICON
然后按照本文4.2节重新编译安装libminigui-gpl-3.0.12

4.4 libmgi-2.0.4

进入到解压目录

CC="gcc -m32" ./configure
make
sudo make install

4.5 mg-samples-3.0.12

进入到解压目录

CC="gcc -m32" ./configure
make

5 配置

将默认配置修改为使用qvfb模拟器,配置资源文件目录,将光标目录资源目录值修改为实际的安装目录,保存退出。我安装的时候libminigui-gpl没有指定路径,所以在MiniGUI.cfg在默认路径下

sudo gedit /usr/local/etc/MiniGUI.cfg
[system]
# GAL engine and default options
#gal_engine=pc_xvfb
gal_engine=qvfb
defaultmode=800x600-16bpp

# IAL engine
#ial_engine=pc_xvfb
ial_engine=qvfb
mdev=/dev/input/mice
mtype=IMPS2

[cursorinfo]
cursorpath=/usr/local/share/minigui/res/cursor/

[resinfo]
respath=/usr/local/share/minigui/res/

6 测试

进入/mg-samples-3.0.12/same,&表示后台执行

qvfb -width 800 -height 480 -depth 32 &

成功运行后台运行qvfb之后,运行例子程序

./same

错误

./notebook: error while loading shared libraries: libminigui_ths-3.0.so.12: cannot open shared object file: No such file or directory

/usr/local/lib目录下是有libminigui_ths-3.0.so.12的,明显是因为找不到库路径,需要增加搜索库路径

解决

sudo vim /etc/ld.so.conf

打开文件后加上include /usr/local/lib,然后执行下面的命令使其生效

sudo ldconfig

错误

NEWGAL: Does not find matched engine: qvfb.
KERNEL>InitGUI: Can not get graphics engine information!

解决
MiniGUI3.0.12版本默认情况下是不开QVFB图像引擎与QVFB输入引擎的,要加–enable-videoqvfb --enable-qvfbial配置项,编译libminigui-gpl–3.0.12的时候,编译安装好之后重新在后台运行qvfb,之后在运行例子程序

错误

NEWGAL: Video mode smaller than requested.
NEWGAL: Set video mode failure.
KERNEL>InitGUI: Can not initialize graphics engine!

解决
运行qvfb的时候指定宽高和多少位和/usr/local/etc/MiniGUI.cfg文件中一样,或者修改MiniGui.cfg中defaultmode=640x480-16bpp (保证这里的参数和qvfb配置中的分辨率一样)

错误

KERNEL>InitGUI: Count not init mouse cursor!
KERNEL>InitGUI: Init failure, please check your MiniGUI configuration or resource.

解决
确保/usr/local/etc/MiniGUI.cfg中下面两个值,和实际安装路径一样
cursorpath=/usr/local/share/minigui/res/cursor/
respath=/usr/local/share/minigui/res/
问题解决后出现画面,很开心啊!!!
minigui same例子界面出现
minigui same例子运行错误
注意看最后一句Aborted (core dumped)段错误,程序异常终止了!使用gdb调试

gdb
(gdb) file same
Reading symbols from same...done.
(gdb) run
Starting program: /home/anruliu/workspace/minigui/mg-samples-3.0.12/same/same 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0xf7a9ab40 (LWP 30606)]
[New Thread 0xf70ffb40 (LWP 30607)]
[New Thread 0xf68feb40 (LWP 30608)]
Program received signal SIGSEGV, Segmentation fault.
0x00000000 in ?? ()
(gdb) backtrace 
#0  0x00000000 in ?? ()
#1  0xf7eb59ec in GAL_VideoSync (rc=rc@entry=0xffffcc90) at video.c:1207
#2  0xf7e4645f in EndPaint (hWnd=hWnd@entry=134544608, hdc=hdc@entry=4160429420) at window.c:4814
#3  0x080496f1 in SameGameProc (hWnd=134544608, message=177, wParam=0, lParam=134544784)
    at same.c:607
#4  0xf7e718c3 in DispatchMessage (pMsg=pMsg@entry=0xffffcebc) at message.c:1061
#5  0x0804a158 in MiniGUIAppMain (argc=argc@entry=1, argv=argv@entry=0xffffcff4) at same.c:732
#6  0x08048fb2 in main (args=1, argv=0xffffcff4) at same.c:697
(gdb) frame 1
#1  0xf7eb59ec in GAL_VideoSync (rc=rc@entry=0xffffcc90) at video.c:1207
1207			video->VideoSync(video, rc);

从上面信息的最后一处可知,在VideoSync(video, rc)函数处程序崩溃了,打开/libminigui-gpl-3.0.12/src/newgal/video.c文件把video->VideoSync(video, rc)这句注释掉,然后重新编译安装libminigui-gpl–3.0.12就可以玩游戏了。

我分析由于是使用了qvfb功能,打开/libminigui-gpl-3.0.12/src/newgal/qvfb/qvfb.c,发现里面并没有VideoSync函数的实现,去调用它肯定会报错,而这个函数只在/libminigui-gpl-3.0.12/src/newgal/fbcon/fbvideo.c中有实现。

如果使用qt-4.8.6的qvfb你会发现按钮不能点击,鼠标闪烁,但是如果换成qt-3.3.0的qvfb,界面很流畅,按钮能点击,功能一切正常,可能是minigui很久没有更新,qt一直在更新,兼容性不好导致的吧。
minigui same运行成功
minigui same运行成功1

参考文献

[1]《MiniGui开发:ubuntu-14.04环境移植MiniGui》
[2]《 minigui成功移植到ubuntu64位平台》
[3]《MiniGUI3.0.12绝对正确安装》
[4]《minigui安装及问题总结》
[5]《MiniGui开发:Ubuntu14.04环境安装qvfb工具》

发布了30 篇原创文章 · 获赞 28 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/anyuliuxing/article/details/77720675