前言
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)
从源代码编译 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
从上图可以看出,Mono 2.8.2 的运行环境是 CLR 4.0.30319.1,这和 Microsoft .NET Framework 4 RTM 的 CLR 版本是一致的。对了,这个 WinForm 程序的全部源代码可以在 通用的“关于本软件”对话框 中找到。
使用 Ubuntu 10.10 操作系统自带的 Mono 2.6.7 来编译和运行这个 C# 程序:
ben@ben-m4000t:~/work/AboutDialog$ gmcs @mak.rsp ben@ben-m4000t:~/work/AboutDialog$ ./AboutDialogTester.exe
从上图中可以看到,Mono 2.6.7 的运行环境是 CLR 2.0.50727.1433,对应于 Microsoft .NET Framework 2.0 SP1 的 CLR 版本。请参阅“Microsoft .NET Framework 的版本”。
磁盘占用
我们来看看 Mono 2.8.2 这个软件包有多大吧:
ben@ben-m4000t:~$ du -hs src/mono-2.8.2 /opt/mono-2.8.2 917M src/mono-2.8.2 234M /opt/mono-2.8.2
可以看出,Mono 2.8.2 的源代码占用 917 MB 的磁盘空间。而编译好的 Mono 2.8.2 软件包占用 234 MB 的磁盘空间,比源代码小了很多。其实编译完成后,源代码就不需要了,可以用以下命令删除:
ben@ben-m4000t:~$ rm -rf src/mono-2.8.2
当然,如果你不在乎这点磁盘空间,或者想研究 Mono 2.8.2 的源代码,那就不用删除了。
另外,编译后的 Mono 2.8.2 软件全部都位于 /opt/mono-2.8.2 目录下。如果以后安装了新的 Mono 版本,只要直接删除 /opt/mono-2.8.2 目录就行了。
配置 Mono 2.8.2 运行环境
我们还可以按如下的方法配置一个 Mono 2.8.2 的运行环境:
ben@ben-m4000t:~$ cd bin ben@ben-m4000t:~/bin$ cat mono28-env #!/bin/bash MONO_PREFIX=/opt/mono-2.8.2 export DYLD_LIBRARY_PATH=$MONO_PREFIX/lib:$DYLD_LIBRARY_PATH export LD_LIBRARY_PATH=$MONO_PREFIX/lib:$LD_LIBRARY_PATH export C_INCLUDE_PATH=$MONO_PREFIX/include:$GNOME_PREFIX/include export ACLOCAL_PATH=$MONO_PREFIX/share/aclocal export PKG_CONFIG_PATH=$MONO_PREFIX/lib/pkgconfig PATH=$MONO_PREFIX/bin:$PATH PS1="[mono] \w @ " ben@ben-m4000t:~/bin$ chmod +x mono28-env
这样,我们就可以按如下方法使用 Mono 2.8.2 运行环境了,有点像 Microsoft Visual Studio 2010 的命令行环境:
ben@ben-m4000t:~$ . mono28-env [mono] ~ @ mono --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) [mono] ~ @ gmcs --version Mono C# compiler version 2.8.2.0 [mono] ~ @ dmcs --version Mono C# compiler version 2.8.2.0 [mono] ~ @
注意上面第一行输入的是“. mono28-env”,也就是说是输入一个小数点后跟一个空格,然后才是“mono28-env”。也可以这么输入“source mono28-env”。不过能够少打几个字不是更好吗? :)
进一步的话题
这次我们仅安装了 Mono 2.8.2 本身,并没有安装配套的 libgdiplus、gtk-sharp、mod_mono、MonoDevelop 等其他相关的东东。如果有用到的话,也就会使用 Ubuntu 10.10 操作系统中默认安装的版本了。