1. 程式人生 > >MingW編譯virt-viewer

MingW編譯virt-viewer

在http://www.spice-space.org/download.html可以下載到windows版本的virt viewer

如果需要定製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 環境。

Microsoft C Runtime
C Runtime是windows平臺的一個概念,一般來說CRT函式(C Runtime函式)就是標準的C語言函式。比如printf, scanf, strlen, fopen等函式就是屬於CRT函式。
但是在windows下所有的CRT函式最終都轉化為win32 API來執行的。windows核心本身,並沒有提供對CRT的支援。

由於MinGW是基於GNU的,自然可以在linux提供了一套交叉編譯環境。有了MinGW,我們可以在linux下開發,編譯,執行windows應用程式。

在安裝完他們後,可以去安裝目錄看看,在我的機器上目錄結構如下。


對於linux開發者來說,這個目錄層次是不是似曾相識。

沒錯!安裝目錄中包含了執行檔案,配置指令碼,以及各種GNU的庫(當然了,這些是windows下DLL,而不在是linux下的.so)

由於virt viewer使用了大量的GNU庫,所以要想重新編譯virt viewer,必須藉助於MinGW。

準備開發環境


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原始碼

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了