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
首先安装编译32位程序的库,因为minigui编译成32位程序比较容易,如果编译换成64位程序,会有很多错误需要修改,安装之前,建议先把本文看完。
sudo apt-get install g++-multilib ia32-libs libc6-dev-i386 linux32
可能有些库没有,但是控制台会提示替代能替代的库,安装就好
libpng,libjpeg,zlib,freetype这四个库都是解压后执行下面的命令,安装到/usr/local/lib
CC="gcc -m32" ./configure
make
sudo make install
安装依赖的第三方库
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
不需要安装qt-4.8.6,此处记录我艰难的安装过程,直接安装qt-3.3.0即可。
选择文件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中更改width、height和depth的值
make
编译成功后,将源码目录bin下的qvfb文件拷贝到qt安装目录bin下,双击qvfb就可以运行,也可以在bin目录下执行
./qvfb
qvfb安装成功。在需要使用minigui前,先打开qvfb模拟工具,让其在后台运行,这样minigui的界面就可以正常运行了。
错误
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: cannot find -lX11
/usr/bin/ld: cannot find -lXtst
/usr/bin/ld: cannot find -lXext
解决
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
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中更改width、height和depth的值,我改的值是
int width = 800;
int height = 480;
int depth = 32;
make
编译成功后,将源码目录bin下的qvfb文件拷贝到qt安装目录bin下,双击qvfb就可以运行,也可以在bin目录下执行
./qvfb
qvfb安装成功。在需要使用minigui前,先打开qvfb模拟工具,让其在后台运行,这样minigui的界面就可以正常运行了。
错误
../include/qvaluelist.h:88:13: error: ‘ptrdiff_t’ does not name a type
typedef ptrdiff_t difference_type;
解决
打开/include/qvaluelist.h与qmap.h,在最上面加入#include
错误
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编译问题记录
进入到解压目录
CC="gcc -m32" ./configure
make
sudo make install
进入到解压目录,注意-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"
进入到解压目录
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
进入到解压目录
CC="gcc -m32" ./configure
make
sudo make install
进入到解压目录
CC="gcc -m32" ./configure
make
将默认配置修改为使用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/
进入/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/
问题解决后出现画面,很开心啊!!!
注意看最后一句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一直在更新,兼容性不好导致的吧。
[1]《MiniGui开发:ubuntu-14.04环境移植MiniGui》
[2]《 minigui成功移植到ubuntu64位平台》
[3]《MiniGUI3.0.12绝对正确安装》
[4]《minigui安装及问题总结》
[5]《MiniGui开发:Ubuntu14.04环境安装qvfb工具》