开发项目在嵌入式平台上使用MiniGui作为用户界面开发工具,在工作之余准备在ubuntu14.04上搭建一个测试环境,这样代码测试起来比较方便。
前前后后搞了好多天,遇到了很多麻烦,但是最后还是跑通了。作为一个之前对minigui完全不懂的小白来说,真的需要好好摸索。
总结一下:minigui真的很坑!如果不是项目必须的东西,我建议读者,能不用就不用。
问题:
- minigui官方提供的依赖库已经是好多年前的,在移植过程中很容易出现安装错误,亲测!
- 据说官方貌似不再维护了。所以即使遇到bug,估计也不好解决。
系统:ubuntu-14.04.3 i686
编译器:gcc-4.8.4, GNU Make 3.81
MiniGui资源下载:MiniGui官网
MiniGui库版本: 3.0.12
资源文件:
minigui-res-be-3.0.12.tar.gz
libminigui-gpl-3.0.12.tar.gz
libmgplus-1.2.4.tar.gz
mg-samples-3.0.12.tar.gz
解压资源文件,进入minigui-res-be-3.0.12目录
$ ./configure –prefix=/home/test/install/minigui/
$ make && make install
进入libminigui-gpl-3.0.12目录
$ ./configure –prefix=/home/test/install/minigui –enable-qvfbial=yes –enable-videoqvfb=yes
$ make
错误:png.c:28:17: fatal error: png.h: No such file or directory
解决:sudo apt-get install libpng12-dev
$ make install
安装完成后查看安装目录
$ ls minigui/
etc include lib share
安装完成后,在指定目录~/install/minigui下,生成了etc include lib share四个文件夹,分别放置了配置文件、头文件、库文件和资源文件,在实际开发时,需要用到这些文件。
解压资源文件,进入libmgplus-1.2.4目录,配置:
./configure –prefix=/home/test/install/minigui PKG_CONFIG_PATH=/home/test/install/minigui/lib/pkgconfig CPPFLAGS=-I/home/test/install/minigui/include
错误:agg_platform_support.cpp:30:28: fatal error: minigui/common.h: No such file or directory
解决:设置minigui头文件目录,CPPFLAGS=-I/home/test/install/minigui/include
执行 $ make && make install
解压资源文件,进入mg-samples-3.0.12目录
./configure –prefix=/home/test/install/minigui PKG_CONFIG_PATH=/home/test/install/minigui/lib/pkgconfig CPPFLAGS=-I/home/test/install/minigui/include
运行make命令进行编译。
错误:dlgdemo.c:40:27: fatal error: mgplus/mgplus.h: 没有那个文件或目录
解决:设置libmgplus头文件目录,CPPFLAGS=-I/home/test/install/minigui/include
提示:No package ‘minigui’ found — 运行configure时增加
PKG_CONFIG_PATH=~/install/minigui/lib/pkgconfig
提示:error: minigui/common.h, 运行configure是增加
CPPFLAGS=-I~/install/minigui/include
在安装目录的etc目录下生产了minigui所需的配置文件MiniGUI.cfg,将该文件拷贝到/etc目录下,并修改部分配置信息。
[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
将默认配置修改为使用qvfb模拟器,配置资源文件目录:
cursorpath=/home/test/install/minigui/share/minigui/res/cursor/
respath=/home/test/install/minigui/share/minigui/res/
将光标目录和源目录值修改为实际的安装目录,保存退出。
参考:MiniGui开发:Ubuntu14.04环境安装qvfb工具
搭建测试环境,创建目录helloworld include lib,将安装目录下的头文件和静态库文件拷贝过来。
$ tree
├── helloworld
│ ├── helloworld.c
│ ├── helloworld_res_cn.h
│ ├── helloworld_res_en.h
│ ├── helloworld_res_tw.h
│ └── Makefile
├── include
│ ├── mgplus
│ └── minigui
└── lib
├── libmgplus.a
└── libminigui_ths.a
编写Makefile:
# Makefile for minigui test
# author hancq
# date 2016-09-30
PRO_NAME=helloworld
MINIGUI_DIR=/home/test/share/workspace/test/minigui
CFLAGS += -I.
CFLAGS += -I$(MINIGUI_DIR)/include
LDFLAGS += -lmgplus -lminigui_ths -lpthread -lm -ldl -lpng -ljpeg -L$(MINIGUI_DIR)/lib
.PHONY:all clean
all:$(PRO_NAME)
$(PRO_NAME):$(PRO_NAME).o
gcc $(CFLAGS) $(PRO_NAME).o -o $@ $(LDFLAGS)
%.o:%.c
gcc $(CFLAGS) -c $^ -o $@
clean:
-rm -rf $(PRO_NAME) *.o
将MiniGui的sample中src目录的helloworld相关的文件拷贝到helloword目录下
$ ls helloworld*
helloworld.c helloworld_res_cn.h helloworld_res_en.h helloworld_res_tw.h
运行make命令编译生成helloworld可执行文件,先执行在后台把qvfb进行运行起来,在执行./helloworld,此时在模拟器中可以正常运行起来了。
测试成功。
其它错误:
错误:./helloworld: error while loading shared libraries: libminigui_ths-3.0.so.12: cannot open shared object file: No such file or directory
解决:编译找不到库文件,需要在编译选项中增加库和库文件路径
错误:KERNEL>InitGUI (step 4): Can not start client (Please run mginit first)!
解决:运行的是客户端版的进程程序,需要先运行服务器mginit。
错误:KERNEL>InitGUI: Count not init mouse cursor!
KERNEL>InitGUI: Init failure, please check your MiniGUI configuration or resource.
解决:找不到资源,修改MiniGui配置文件中资源文件目录。
ar zxvf qvfb2-2.0.tar.gz
进入目录,配置
./configure
出现如下错误:
configure: error: Qt (>= Qt 3.2 and < 4.0) (library qt-mt) not found.
解决: sudo apt-get install
libqt3-mt-dev libqt3-headers
./configure –with-qt-includes=/usr/include/qt3 –with-qt-lilbraries=/usr/lib/qt3Can’t find X includes. Please check your installation and add the
correct paths!
解决: sudo apt-get install xorg-devmgplus/mgplus.h: No such file or directory #include mgplus/mgplus.h
解决: 注释掉此头文件error: C++ preprocessor “/lib/cpp” fails sanity check See `config.log’
for more details.
解决: sudo apt-get install build-essential
没有错误后,
make
sudo make install
tar zxvf minigui-res-be-3.0.12.tar.gz
./configure
sudo make install
tar zxvf libminigui-gpl-3.0.12.tar.gz
./configure
make
sudo make install
在/etc/ld.so.conf.d新建一个文件minigui.conf,在其中输入/usr/local/lib
然后刷新动态库:
sudo ldconfig
tar zxvf libmgplus-1.2.4.tar.gz
./configure
make
sudo make install
tar zxvf libmgi-2.0.4.tar.gz
./configure
make
sudo make install
tar zxvf libmg3d-1.0.2.tar.gz
./configure
make
sudo make install
tar zxvf libmgutils-1.0.4.tar.gz
./configure
make
sudo make install
tar zxvf libmgp-1.2.2.tar.gz
./configure
make
sudo make install
tar zxvf libmgncs-1.0.8.tar.gz
./configure
make
sudo make install
tar zxvf mg-samples-3.0.12.tar.gz
./configure
make
最后,运行minigui sample
修改MiniGUI.cfg( /usr/local/etc/MiniGUI.cfg):
将第44行的gvfb改为qvfb2
运行demo程序
./mg-samples-3.0.12/same/same
start-qvfb :/usr/local/bin/qvfb2 pcxvfb 13997 XVFB-for-MiniGUI-3.0-(Gtk-Version) 800x600-16bpp
成功!
ubuntu编译minigui 3.0.12出现下面错误:
object.h:275:9: error: incompatible types when assigning to type ‘va_list’ from type ‘struct __va_list_tag *’
网上搜索了下说是编译系统是64位导致的,换为32位就可以了。但是我的编译系统无法换,看了下,直接在对应的makefile里面修改把该模块编译为32位。如下:
CFLAGS = -m32 -g -O2
在CFLAGS上加上-m32就可以了。
(这个最好用32位的系统来编译,不然所有makefile都要修改,比较麻烦)
复习:
复习一下GCC命令行参数,看看各个版本的区别——
32位版:加上 -m32 参数,生成32位的代码。
64位版:加上 -m64 参数,生成64位的代码。
debug版:加上 -g 参数,生成调试信息。
release版:加上 -static 参数,进行静态链接,使程序不再依赖动态库。加上 -O3 参数,进行最快速度优化。加上-DNDEBUG参数,定义NDEBUG宏,屏蔽断言。
当没有-m32或-m64参数时,一般情况下会生成跟操作系统位数一致的代码,但某些编译器存在例外,例如——
32位Linux下的GCC,默认是编译为32位代码。
64位Linux下的GCC,默认是编译为64位代码。
Window系统下的MinGW,总是编译为32位代码。因为MinGW只支持32位代码。
Window系统下的MinGW-w64(例如安装了TDM-GCC,选择MinGW-w64),默认是编译为64位代码,包括在32位的Windows系统下。
后面回来解决这个问题:
我Ubuntu14.04是64位的:
uname -a
Linux 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
步骤:
Ubuntu 64bit兼容32bit GCC 交叉编译环境搭建
方法一:
(1)sudo apt-get install lib32z1
(2)sudo apt-get install lib32stdc++6
方法二(时间较长):
(1)sudo apt-get update
(2)sudo apt-get dist-upgrade
(3)sudo apt-get install ia32-libs
下面安装:
sudo apt-get install libc6-dev-i386 lib32ncurses5-dev … # whatever 32-bit libraries
export LDFLAGS='-m32 -L/usr/lib32'
export CFLAGS='-m32'
export CXXFLAGS='-m32'
./configure …
make后面会发现下面的错误:
i386:x86-64 architecture of input file
`/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crti.o’ is
incompatible with i386 output
然后修改libminigui-gpl-3.0.12下面的libtool文件里面的:
CC=”gcc -m32”