1.安装minigui开发中使用到的库
luther@gliethttp:~$ sudo apt-get install libpng12-dev libjpeg62-dev libqt3-mt
2.释放下载下来的minigui_3.0.1源码到相应目录
luther@gliethttp:/vobs/minigui/minigui_3.0.1$ sudo tar zxvf minigui_include.tar.gz -C /usr/local/include/
luther@gliethttp:/vobs/minigui/minigui_3.0.1$ sudo tar zxvf minigui_lib.tar.gz -C /usr/local/lib/
luther@gliethttp:/vobs/minigui/minigui_3.0.1$ sudo cp qvfb2 /usr/local/bin/
3.解压编译实例源码
luther@gliethttp:/vobs/minigui/minigui_3.0.1$ tar zxvf mg-samples-3.0.1.tar.gz
luther@gliethttp:/vobs/minigui/minigui_3.0.1/mg-samples-3.0.1$ ./configure
luther@gliethttp:/vobs/minigui/minigui_3.0.1/mg-samples-3.0.1$ make
4.编译成功后运行实例
luther@gliethttp:/vobs/minigui/minigui_3.0.1/mg-samples-3.0.1/mginit$ ./mginit &
./mginit: error while loading shared libraries: libminigui_procs-3.0.so.1: cannot open shared object file: No such file or directory
明显是因为找不到库路径,那么强行指定库路径.
luther@gliethttp:/vobs/minigui/minigui_3.0.1/mg-samples-3.0.1/src$ export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH
或者添加库搜诉路径sudo vim /etc/ld.so.conf追加:include /usr/local/lib然后使用如下命令刷新sudo ldconfigluther@gliethttp:/vobs/minigui/minigui_3.0.1/mg-samples-3.0.1/mginit$ ./mginit 启动后界面效果图如下:
来运行一个实例
luther@gliethttp:/vobs/minigui/minigui_3.0.1/mg-samples-3.0.1/src$ ./trackbar
New comming in client:
New client joined layer: (mginit, trackbar)
效果图如下:
5.对于单独编译一个.c文件,可以使用如下命令:
luther@gliethttp:/vobs/minigui/minigui_3.0.1/mg-samples-3.0.1/src$ gcc -o trackbar trackbar.c -lpng -ljpeg -lminigui_procs
PS:minigui的InitGUI()库函数存在bug,对于非法关闭qvfb2,比如:直接关闭terminal,
这样/var/tmp/mginit锁文件将不能释放,所以下一次将因为锁文件mginit存在而提示:
KERNEL>InitGUI (step 3): There is already an instance of 'mginit'!如果在qvfb2打开时直接将通过命令行运行mginit的terminal关闭,那么再次启动mginit时就会提示:
KERNEL>InitGUI (step 3): There is already an instance of 'mginit'!
我们手工将/var/tmp/mginit锁文件删除,继续执行./mginit,提示另外一个错误:
KERNEL>LoadSharedResource: File existsKERNEL>InitGUI (step 8): Can not load shared resource!Segmentation fault表示InitGUI()库函数发现创建的共享内存和共享信号量仍然存在,而不能创建,导致如上错误提示,从逻辑上来看,首先InitGUI()库函数先检查/var/tmp/mginit锁文件是否存在,如果不存在,那么说明没有mginit存在,所以如果再次创建共享内存和共享信号量失败,那么说明发生了上面关闭terminal的情况(或者手工被删除),应该清除先前创建的共享内存和共享信号量,既然InitGUI()库函数没有这么做,那么只能由我们用户自己做了,有2中解决方法:
1.手工删除/var/tmp/mginit
luther@gliethttp:~$ rm /var/tmp/mginit
2.重启pc或者使用下面介绍的shell脚本直接删除.
接下来重启电脑或者执行下面释放滞留下来的共享内存和滞留下来的共享信号量操作:)
luther@gliethttp:~$ ipcs -m|awk '{if(NF>=6 && $7=="")printf "-m %s\n",$2}'|xargs sudo ipcrm
luther@gliethttp:~$ ipcs -s|awk '{if($5==1)printf "-s %s\n",$2}'|xargs sudo ipcrm
然后使用
luther@gliethttp:~$ ipcs -s -t 查看一下时间,将刚才启动程序对于的时间对应的sem删除掉进即可
luther@gliethttp:/var/tmp$ ipcs -s -t
------ Semaphore Operation/Change Times --------
semid owner last-op last-changed
950273 luther Thu Jun 18 13:30:41 2009 Thu Jun 18 13:30:38 2009
983042 luther Thu Jun 18 13:30:41 2009 Thu Jun 18 13:30:38 2009
所以还需要删除这2个Semaphore
luther@gliethttp:~$ ipcrm -s 950273
luther@gliethttp:~$ ipcrm -s 983042
这样qvfb2就可以正常启动了[luther.gliethttp]:)
PS2:发现qvfb2创建1个共享内存和3个共享信号量
uther@gliethttp:~$ ipcs
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00002f27 8159271 luther 666 1572936 0
------ Semaphore Arrays --------
key semid owner perms nsems
0x00002eda 2031616 luther 666 1
0x464d4702 2064385 luther 666 4
0x464d4703 2097154 luther 666 64