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工具》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章