前言
Ubuntu 10.10 自帶了 Mono 2.6.7。而目前最新版本是 Mono 2.8.2。由於 Ubuntu 操作系統中的“阿貼便箋”等軟件是用 C# 開發的,因此它們依賴於 Mono 。爲了不破壞 Ubuntu 操作系統中這類軟件,我們需要並行地安裝 Mono 2.8.2,具體做法是安裝到 /opt/mono-2.8.2 目錄下。這樣兩個版本的 Mono 就可以共存了。
準備工作
先準備一下編譯環境,使用如下的命令來安裝:
ben@ben-m4000t:~$ sudo apt-get install build-essential automake libtool mono-complete gendarme subversion libpng-dev libtiff-dev libgif-dev libjpeg-dev libexif-dev autoconf bison flex libcairo-dev libpango1.0-dev
上面的 build-essential 軟件包是基本的編譯環境,包括 C/C++ 編譯器。而 mono-complete 是 mono 的編譯環境,包括 C# 編譯器。Ubuntu 操作系統默認安裝的是 mono 的運行環境,並不包括編譯環境。你沒有看錯,我們想從源代碼編譯 mono 2.8.2,先要安裝一個操作系統默認提供的 mono 編譯環境,對於 Ubuntu 10.10 操作系統來說就是 mono 2.6.7 的編譯環境。mono 的源代碼核心部分是用 C/C++ 語言編寫的,可能還有一部分是用彙編語言編寫的。但是還有一大部分,比如 .NET Framework Base Class Library 之類的,是用 C# 語言編寫的。所以說,從源代碼編譯高版本的 mono,需要先安裝低版本的 mono。
從源代碼編譯 Mono 2.8.2
現在讓我們從 Mono 的源代碼自己編譯一個吧:
ben@ben-m4000t:~$ cd src ben@ben-m4000t:~/src$ wget http://ftp.novell.com/pub/mono/sources/mono/mono-2.8.2.tar.bz2 --2011-01-07 10:02:49-- http://ftp.novell.com/pub/mono/sources/mono/mono-2.8.2.tar.bz2 正在解析主機 ftp.novell.com... 130.57.1.88 正在連接 ftp.novell.com|130.57.1.88|:80... 已連接。 已發出 HTTP 請求,正在等待迴應... 200 OK 長度: 31292886 (30M) [application/x-bzip2] 正在保存至: “mono-2.8.2.tar.bz2” 100%[===========================>] 31,292,886 15.5K/s 花時 28m 14s 2011-01-07 10:31:04 (18.0 KB/s) - 已保存 “mono-2.8.2.tar.bz2” [31292886/31292886]) ben@ben-m4000t:~/src$ tar xjf mono-2.8.2.tar.bz2 ben@ben-m4000t:~/src$ rm mono-2.8.2.tar.bz2 ben@ben-m4000t:~/src$ cd mono-2.8.2 ben@ben-m4000t:~/src/mono-2.8.2$ ./configure --prefix=/opt/mono-2.8.2 ==========> 這裏省略了一大堆輸出 <========== mcs source: mcs olive source: Engine: GC: sgen and bundled Boehm GC with typed GC and parallel mark GLIB: embedded TLS: __thread SIGALTSTACK: yes Engine: Building and using the JIT oprofile: no BigArrays: no DTrace: no Parallel Mark: yes LLVM Back End: no (dynamically loaded: no) Libraries: Moon Profile: no MonoTouch: no JNI support: IKVM Native libgdiplus: assumed to be installed zlib: system zlib ben@ben-m4000t:~/src/mono-2.8.2$ make =====> 這裏進行漫長的編譯過程,併產生一大堆輸出 <===== ben@ben-m4000t:~/src/mono-2.8.2$ sudo make install ===> 這裏進行不那麼漫長的安裝過程,併產生一大堆輸出 <=== ben@ben-m4000t:~/src/mono-2.8.2$
注意上面爲編譯配置環境時使用了 --prefix=/opt/mono-2.8.2 參數,這是並行安裝的關鍵。如果省略這個參數,最後使用 make install 進行安裝時就會覆蓋掉原來的 mono 2.6.7 版本。
安裝後的配置
安裝完畢後,可以添加一些快捷的命令:
ben@ben-m4000t:~$ cd bin ben@ben-m4000t:~/bin$ cat dmcs exec /opt/mono-2.8.2/bin/dmcs "$@" ben@ben-m4000t:~/bin$ cat mono28 exec /opt/mono-2.8.2/bin/mono "$@"
上面的意思是說使用你自己喜歡的編輯器,比如 vim,或者 gedit,在 $HOME/bin 目錄下建立快捷命令,以方便使用。命令的內容就如上所示。mono28 命令用來運行“mono 2.8.2 運行時”本身,dmcs 用來運行 mono 2.8.2 的 C# 4.0 編譯器。注意 mono 2.6.7 的 C# 編譯器是 gmcs,而沒有 dmcs,所以就不用寫成 dmcs28 了。mono 2.8.2 也有 C# 2.0 編譯器,也叫 gmcs,如果需要的話,直接用 /opt/mono-2.8.2/bin/gmcs 運行好了。
驗證安裝結果
試運行一下:
ben@ben-m4000t:~$ mono28 --version Mono JIT compiler version 2.8.2 (tarball 2011年 01月 07日 星期五 10:52:34 CST) Copyright (C) 2002-2010 Novell, Inc and Contributors. www.mono-project.com TLS: __thread SIGSEGV: altstack Notifications: epoll Architecture: amd64 Disabled: none Misc: debugger softdebug LLVM: supported, not enabled. GC: Included Boehm (with typed GC and Parallel Mark) ben@ben-m4000t:~$ dmcs --version Mono C# compiler version 2.8.2.0 ben@ben-m4000t:~$ /opt/mono-2.8.2/bin/gmcs --version Mono C# compiler version 2.8.2.0
檢查一下 Ubuntu 10.10 自帶的 mono 2.6.7:
ben@ben-m4000t:~$ mono --version Mono JIT compiler version 2.6.7 (Debian 2.6.7-3ubuntu1) Copyright (C) 2002-2010 Novell, Inc and Contributors. www.mono-project.com TLS: __thread GC: Included Boehm (with typed GC and Parallel Mark) SIGSEGV: altstack Notifications: epoll Architecture: amd64 Disabled: none ben@ben-m4000t:~$ gmcs --version Mono C# compiler version 2.6.7.0
原來的 mono 並沒有被我們破壞。
實際應用
讓我們使用剛安裝好的 Mono 2.8.2 來編譯和運行一個 C# 程序吧:
ben@ben-m4000t:~/work/AboutDialog$ dmcs @mak.rsp ben@ben-m4000t:~/work/AboutDialog$ mono28 AboutDialogTester.exe