Ubuntu 10.10 操作系统中安装 Mono 2.8.2



Ubuntu 10.10 操作系统中安装 Mono 2.8.2

前言

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 is no longer required on Linux systems, unless it is a 32 bit system. Mac systems still require the presence of mono.?

Compiling from source ensures the latest version of Mono. Note that under Linux this is only required for 32-bit systems. 64 bit systems should use the native McMyAdmin binary.

In some cases, you may want to use a prefix of /opt/mono – this will require you to either add this directory to your PATH environment variable, or explicitly specify the full path to Mono when you want to run it.

Then run the following as root:

apt-get install gcc g++ bison gettext make
cd /usr/local/src
wget http://download.mono-project.com/sources/mono/mono-2.10.8.tar.gz
tar zxvf mono-2.10.8.tar.gz
cd mono-2.10.8
./configure --prefix=/usr/local
make && make install

Instead of ./configure --prefix=/usr/local you can use ./configure --prefix=/opt/mono (as discussed above). If you get an “Out of memory” error while running make on memory-limited systems, try running the following to allow higher virtual memory usage:

ulimit -v unlimited

现在让我们从 Mono 的源代码自己编译一个吧:

ben@ben-m4000t:~$ cd src
ben@ben-m4000t:~/src$ wget http://download.mono-project.com/sources/mono/mono-2.10.8.tar.gz
--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 操作系统中默认安装的版本了。