1 庫文件下載
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
可能有些庫沒有,但是控制檯會提示替代能替代的庫,安裝就好
libpng,libjpeg,zlib,freetype這四個庫都是解壓後執行下面的命令,安裝到/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-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: <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-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 <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/
問題解決後出現畫面,很開心啊!!!
注意看最後一句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工具》