在http://www.spice-space.org/download.html可以下载到windows版本的virt viewer
virt-viewer-x86-0.5.7.msi和virt-viewer-x64-0.5.7.msi是使用MingW编译出来的,源码就是使用virt-viewer-0.5.7.tar.gz
如果需要定制virt viewer,就需要从源码编译出可执行的二进制码,本文就是描述编译windows版virt viewer的过程。
MinGW
在使用MinGw编译virt viewer之前,我们先简单介绍一下MinGW。鉴于MinGw过于庞大,我们也只能点到为止。
MinGW是Minimalist GUN for Windows的缩写。MinGW提供了一套开发环境,用来开发Microsoft windows本地应用。
MinGW提供了一套完全开源的编程工具集,不需要依赖于第三方的C运行DLL,就可以开发Windows本地应用。当然MinGW还是依赖于microsoft提供的几个操作系统DLL,比如MSVCRT.DLL。
MinGW 编译器提供了对Microsoft C Runtime的以及一些语言特定runtimes的访问。MinGW的Minimalist,就体现在这里,MinGW没有尝试提供一个POSIX runtime 环境。
- <span style="font-size:10px;">Microsoft C Runtime
- C Runtime是windows平台的一个概念,一般来说CRT函数(C Runtime函数)就是标准的C语言函数。比如printf, scanf, strlen, fopen等函数就是属于CRT函数。
- 但是在windows下所有的CRT函数最终都转化为win32 API来执行的。windows内核本身,并没有提供对CRT的支持。
- </span>
由于MinGW是基于GNU的,自然可以在linux提供了一套交叉编译环境。有了MinGW,我们可以在linux下开发,编译,运行windows应用程序。
上面提到的virt-viewer-x86-0.5.7.msi和virt-viewer-x64-0.5.7.msi 就是MinGW编译环境的产物
在安装完他们后,可以去安装目录看看,在我的机器上目录结构如下。
对于linux开发者来说,这个目录层次是不是似曾相识。
没错!安装目录中包含了执行文件,配置脚本,以及各种GNU的库(当然了,这些是windows下DLL,而不在是linux下的.so)
由于virt viewer使用了大量的GNU库,所以要想重新编译virt viewer,必须借助于MinGW。
准备开发环境
MinGW开发环境
在windows上搭建MinGW开发环境,可参考http://www.mingw.org/wiki/InstallationHOWTOforMinGW, windows下MinGW开发环境是官方支持的
这里我们只描述linux下MinGW开发环境的搭建。注意,由于linux MinGW交叉编译环境是distributors提供的,这些交叉工具链并不是MinGW.org直接提供的。
Linux发行版Fedora上提供了MinGW开发包,因此我们选择Fedora 19做为软件环境。
Fedora的MinGW有相当多的软件包,我们这里选择全部安装,总计700MB,好在今天网速快。
- # su
- # yum install mingw*
- # yum install intltool
- # yum install icoutils.i686
编译virt viewer
1. 下载virt-viewer源码
在https://fedorahosted.org/released/virt-viewer/ 有很多virt_viewer的版本,这里我们使用virt-viewer-0.5.6.tar.gz
2. 解压
- # tar zxvf virt-viewer-0.5.76.tar.gz
- # cd virt-viewer-0.5.6
3. 首先执行MinGW的configure工具
- # mingw32-configure --with-gtk=2.0 --with-spice-gtk
由于上面准备MinGW 环境时,我们已经安装了绝大多数的库,所以一般来说这里不会失败,如果失败,按照提示使用yum安装即可。
在我的机器上显示如下
- configure: Configuration summary
- configure: =====================
- configure:
- configure: Features:
- configure:
- configure: Gtk: 2.0
- configure:
- configure: Libraries:
- configure:
- configure: GLIB2: -mms-bitfields -I/usr/i686-w64-mingw32/sys-root/mingw/include/glib-2.0 -I/usr/i686-w64-mingw32/sys-root/mingw/lib/glib-2.0/include -L/usr/i686-w64-mingw32/sys-root/mingw/lib -lgthread-2.0 -lgmodule-2.0 -lglib-2.0 -lintl
- configure:
- configure: GTK: -mms-bitfields -I/usr/i686-w64-mingw32/sys-root/mingw/include/gtk-2.0 -I/usr/i686-w64-mingw32/sys-root/mingw/lib/gtk-2.0/include -I/usr/i686-w64-mingw32/sys-root/mingw/include/atk-1.0 -I/usr/i686-w64-mingw32/sys-root/mingw/include/cairo -I/usr/i686-w64-mingw32/sys-root/mingw/include/gdk-pixbuf-2.0 -I/usr/i686-w64-mingw32/sys-root/mingw/include/pango-1.0 -I/usr/i686-w64-mingw32/sys-root/mingw/include/glib-2.0 -I/usr/i686-w64-mingw32/sys-root/mingw/lib/glib-2.0/include -I/usr/i686-w64-mingw32/sys-root/mingw/include/pixman-1 -I/usr/i686-w64-mingw32/sys-root/mingw/include -I/usr/i686-w64-mingw32/sys-root/mingw/include/freetype2 -I/usr/i686-w64-mingw32/sys-root/mingw/include/libpng15 -I/usr/i686-w64-mingw32/sys-root/mingw/include/harfbuzz -Wl,-luuid -L/usr/i686-w64-mingw32/sys-root/mingw/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -limm32 -lshell32 -lole32 -latk-1.0 -lpangocairo-1.0 -lgio-2.0 -lgdk_pixbuf-2.0 -lpangoft2-1.0 -lpangowin32-1.0 -lgdi32 -lfreetype -lfontconfig -lpango-1.0 -lm -lcairo -lgobject-2.0 -lglib-2.0 -lintl
- configure:
- configure: GTK_VNC: -mms-bitfields -I/usr/i686-w64-mingw32/sys-root/mingw/include/gtk-vnc-1.0 -I/usr/i686-w64-mingw32/sys-root/mingw/include/gvnc-1.0 -I/usr/i686-w64-mingw32/sys-root/mingw/include/gtk-2.0 -I/usr/i686-w64-mingw32/sys-root/mingw/include/glib-2.0 -I/usr/i686-w64-mingw32/sys-root/mingw/lib/glib-2.0/include -I/usr/i686-w64-mingw32/sys-root/mingw/lib/gtk-2.0/include -I/usr/i686-w64-mingw32/sys-root/mingw/include/atk-1.0 -I/usr/i686-w64-mingw32/sys-root/mingw/include/cairo -I/usr/i686-w64-mingw32/sys-root/mingw/include/gdk-pixbuf-2.0 -I/usr/i686-w64-mingw32/sys-root/mingw/include/pango-1.0 -I/usr/i686-w64-mingw32/sys-root/mingw/include/pixman-1 -I/usr/i686-w64-mingw32/sys-root/mingw/include -I/usr/i686-w64-mingw32/sys-root/mingw/include/freetype2 -I/usr/i686-w64-mingw32/sys-root/mingw/include/libpng15 -I/usr/i686-w64-mingw32/sys-root/mingw/include/harfbuzz -Wl,-luuid -L/usr/i686-w64-mingw32/sys-root/mingw/lib -lgtk-vnc-1.0 -lgvnc-1.0 -lgtk-win32-2.0 -lgdk-win32-2.0 -limm32 -lshell32 -lole32 -latk-1.0 -lpangocairo-1.0 -lgio-2.0 -lgdk_pixbuf-2.0 -lpangoft2-1.0 -lpangowin32-1.0 -lgdi32 -lfreetype -lfontconfig -lpango-1.0 -lm -lcairo -lgobject-2.0 -lglib-2.0 -lintl
- configure:
- configure: SPICE_GTK: -mms-bitfields -I/usr/i686-w64-mingw32/sys-root/mingw/include/spice-client-gtk-2.0 -I/usr/i686-w64-mingw32/sys-root/mingw/include/gtk-2.0 -I/usr/i686-w64-mingw32/sys-root/mingw/include/spice-client-glib-2.0 -I/usr/i686-w64-mingw32/sys-root/mingw/lib/gtk-2.0/include -I/usr/i686-w64-mingw32/sys-root/mingw/include/atk-1.0 -I/usr/i686-w64-mingw32/sys-root/mingw/include/cairo -I/usr/i686-w64-mingw32/sys-root/mingw/include/gdk-pixbuf-2.0 -I/usr/i686-w64-mingw32/sys-root/mingw/include/pango-1.0 -I/usr/i686-w64-mingw32/sys-root/mingw/include/glib-2.0 -I/usr/i686-w64-mingw32/sys-root/mingw/lib/glib-2.0/include -I/usr/i686-w64-mingw32/sys-root/mingw/include/pixman-1 -I/usr/i686-w64-mingw32/sys-root/mingw/include -I/usr/i686-w64-mingw32/sys-root/mingw/include/freetype2 -I/usr/i686-w64-mingw32/sys-root/mingw/include/libpng15 -I/usr/i686-w64-mingw32/sys-root/mingw/include/harfbuzz -I/usr/i686-w64-mingw32/sys-root/mingw/include/spice-1 -Wl,-luuid -L/usr/i686-w64-mingw32/sys-root/mingw/lib -lspice-client-gtk-2.0 -lgtk-win32-2.0 -lspice-client-glib-2.0 -lgdk-win32-2.0 -limm32 -lshell32 -lole32 -latk-1.0 -lpangocairo-1.0 -lgio-2.0 -lgdk_pixbuf-2.0 -lpangoft2-1.0 -lpangowin32-1.0 -lgdi32 -lfreetype -lfontconfig -lpango-1.0 -lm -lcairo -lgobject-2.0 -lglib-2.0 -lintl
- configure:
- configure: LIBXML2: -I/usr/i686-w64-mingw32/sys-root/mingw/include/libxml2 -L/usr/i686-w64-mingw32/sys-root/mingw/lib -lxml2
- configure:
- configure: LIBVIRT: -I/usr/i686-w64-mingw32/sys-root/mingw/include -L/usr/i686-w64-mingw32/sys-root/mingw/lib -lvirt -lportablexdr -lintl
- configure:
- configure: OVIRT:
- configure:
编译
- mingw32-make
编译过程也可能出现依赖的工具错误,下载需要的工具包即可解决
安装
- mingw32-make install
执行安装命令后,会把编译生成的文件拷贝到/usr/i686-w64-mingw32/sys-root/mingw下,文件的执行依赖于这个目录下的bin, etc, conf, lib 和share,我们需要把这几个目录的内容都拷贝到windows下。
这些目录下是MinGW windows应用程序基本运行环境,大部分并不是virt-viewer必须的,后面我们会把virt-viewer运行必须的文件列表列出来。
执行
- cd mingw
- cd bin
- remote-viewer.exe
即可看到GTK样式的remote viewer了