在 Windows 上构建 Mono:最后的决战






4.79/5 (10投票s)
定义了在 Windows 上使用 Cygwin 构建 Mono 的完整过程
引言
本文提供了一个使用 Cygwin 在 Windows 上构建 Mono 的完整分步指南。网上有很多提供相同教程的文章,但由于各种不确定性,它们都没有给我带来预期的结果。
作为我构建过程基础的两篇精彩文章是:
- "Mono + Cygwin 安装和编译教程,或如何保持理智地完成这项工作" 作者 Andreia Gaita
- "在 Windows 上构建 Mono" 作者 Kevin Shockey
Mono
Mono 是一个免费的开源 .NET 实现,主要面向 Linux 世界,但也适用于 MacOS 和 Windows。它包含许多出色的组件,例如自己的 C# 编译器 (mcs)、.NET 运行时 (mono)、.NET 类库、与 Gtk 的集成、IDE (MonoDevelop) 等。
构建过程
构建过程与文章中描述的相同
- 安装适用于 Windows 的稳定版 Mono
- 安装 Cygwin
- 从 SVN 获取源代码
- 在 Cygwin 中使用 Mono 构建 Mono
不同之处在于,本文允许您轻松地在没有 Cygwin 的情况下使用编译好的 Mono。此外,一些仅在一篇文章中提及而在其他文章中被忽略的步骤也会被重点突出。
安装稳定的预编译 Mono
这是最简单的步骤 :)。
您可以在 此链接 下载,只需使用稳定安装程序。
如果您希望在未来获得一些高级体验(我计划尝试构建 MonoDevelop),则推荐使用组合安装程序。它可以在 Novell forge 上找到,文件名为“mono-x.x.x-gtksharp-x.x.x-win32-exp-x.x.exe”。
重要提示。请从第一个链接下载;默认情况下,它建议安装到“C:\Program Files\Mono-x.x.x”目录。您应该修改它,以便目标路径不包含空格。推荐使用“C:\mono\Mono-x.x.x”。此处以及本文的其余部分,x.x.x 代表您下载的 Mono 版本。
安装 Cygwin
准备步骤
强烈建议您的 Windows 登录名不包含空格。如果包含,您就很麻烦了,但可以修复(阅读此内容,第 2 页,问题 13)。
如果您过去曾尝试安装 Cygwin 但不成功,请先将其删除。有关详细信息,请参阅 此处(第 1 部分)。
安装 Cygwin
我建议使用最新版本,始终可从 http://www.cygwin.com 获取。
下载“setup.exe”文件,将其放在磁盘上的某个位置,然后运行它。确保该磁盘上有足够的可用空间(至少 100M)。
运行设置程序后,**选择默认设置**(目标路径、UNIX 行尾符等),从列表中选择一个镜像,然后将显示可用软件包列表。
使用“View”按钮切换到“Full view”模式。现在您将看到所有软件包。其中大多数都有“Skip
”选项。选择以下软件包:
automake
bison
gcc
gdb
gettext
intltool
libiconv
libtool
pkg-config
确保不要遗漏任何一个。
不要选择“make”和“glib”软件包。如果您对此感兴趣,请阅读 本教程(安装 Cygwin)。
如果您不介意使用“vim”,也可以选择它。
现在单击“Next”按钮,等待下载和配置过程完成。
配置 Cygwin
使用“开始”菜单中的图标或桌面图标,运行 Cygwin bash shell。
如果您是域用户,您将收到一条警告,提示并非所有域中的用户和组都包含在您的“etc/*”文件中。警告会提示您运行两个命令来修复此问题。请执行此操作。然后退出 Cygwin(键入“exit”并按Enter)。
再次运行 Cygwin。现在它应该会创建“/home/your_name”目录(路径相对于 Cygwin 的根目录),并将四个文件复制到其中:“.bash_history”、“.bash_profile”、“.bashrc”、“.inputrc”。文件名开头的句点表示这些是 UNIX 隐藏文件。
在您熟悉 vi/vim 之前,您需要一个好的文本编辑器。我说的“好”是指“比记事本稍微聪明一点的”,因为您需要编辑带有类 UNIX 行尾符的文件。区别在于 UNIX 文件使用“\n
”,而 Windows 使用“\n\r
”,这是一个问题。因此,我推荐Notepad++,可以在 此处下载。它稍后还会再次帮助我们。
所以,如果您不喜欢(不知道)vim,请退出 Cygwin 并安装“智能”的 Notepad。打开“c:/cygwin/home/your_name/.bashrc”文件,并在末尾添加以下文本:
#Environment Variables for Mono
export PATH="/usr/local/bin:/usr/local/lib:$PATH:/usr/local/icu/bin"
export ACLOCAL_FLAGS="-I /usr/share/aclocal"
export CPPFLAGS="$CPPFLAGS -I/usr/local/include"
export LDFLAGS="$LDFLAGS -L/usr/local/lib"
export CC="gcc -mno-cygwin"
export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:/usr/lib/pkgconfig"
export LD_LIBRARY_PATH="/usr/local/lib:/usr/lib"
export MONO_PATH="/usr/local/lib:/usr/lib:$MONO_PATH"
export MONO_CFG_PATH="/usr/local/etc:/usr/etc:$MONO_CFG_PATH"
#Environment variables for .NET if not already in your Windows PATH
#These variables could be needed by older Mono build systems
#export PATH=$PATH:`GetNetSdkLocation -cs msnet_1.1`/v1.1.4322
#export PATH=$PATH:`GetNetSdkLocation -cs msnetsdk_1.1`/Bin
(感谢 Kevin Shockey 的文章。)
这将每次运行 Cygwin 时都设置必要的环境变量。退出 Cygwin 并再次运行它。
安装额外软件包
一些必需的软件包在 Cygwin 存储库中不可用(例如 perl-XML-Parcer),而另一些软件包(例如 make)不符合我们的目标。因此,现在我们将手动从 tarball 安装它们。
进入 bash 并输入:
mkdir -p /download/mono
这会在 Cygwin 根目录下创建“download”和“download/mono”目录。当然,您也可以从 Windows Explorer 完成同样的操作。
现在,使用 此链接从 Mono 官方网站下载正确版本的 make。将文件保存到“c:/cygwin/download”目录。另外,从 此链接下载 Perl-XML 解析器。
现在我们必须安装(实际上是提取)它们:
tar -xjvf /download/perl-XML-Parser-2.34-1.tar.bz2
看起来确实不太美观。但是“bash”环境(以及 Windows cmd,顺便说一下)在按Tab键时提供了很好的自动完成功能。所以您可以输入“tar -xjvf /d
”,然后按Tab键,下载就会自动完成。然后打印“/perl”并再次按Tab键。搞定!
以同样的方式提取 make
。
最后的 Cygwin 准备工作
还剩下一些小的调整。
首先,我们将把 Mono 的 bin、lib 和其他目录挂载到我们的 Cygwin 环境中。这可以通过输入以下命令来完成:
mount -s c:/mono/Mono-x.x.x /usr/local
通过 Windows Explorer 检查您的“/usr/local”目录。bin、lib 和 etc. 目录是空的。在 Cygwin 中进入它们(cd /usr/local/bin)并查看它们的内容(dir)。您会看到它们反映了相应的 Mono 目录。现在 Mono 安装存在于 Cygwin 环境中,可以从那里看到,并且可以使用(并且将会被使用)。
键入“mono --version”进行验证。您必须看到有关现有 Mono 的信息。
现在我们必须用 Mono 的 mcs 替换 Microsoft 编译器(可能已安装在您的计算机上)。这可以通过创建一个指向 mcs 的链接来完成,该链接将替换“csc.exe”的调用。
键入“ln -s /usr/local/bin/mcs ./csc.exe”。然后通过键入“csc.exe --version”检查结果。结果应与“mcs --version”相同。
好的,我们已经准备好 Cygwin 了。
安装 Subversion
Subversion 是版本控制系统,是 CVS 的子代和征服者。我们需要它来获取最新的 Mono 和 mcs 源代码。
您可以选择命令行工具(原始发行版)或 GUI 实现(TortoiseSVN)。
命令行 SVN
在此处下载并安装 SVN:此处。通常,只有倒数第二个版本作为 Windows 安装程序发布,而最新版本则以 zip 格式提供。我建议同时下载两者,使用安装程序安装 SVN(这将设置一些环境变量),然后用最新 zip 文件中的文件替换已安装的文件。
打开 cmd 并键入“svn --version”来检查 SVN 是否已安装。
TortoiseSVN
TortoiseSVN 是一个漂亮且易于使用的 Windows Subversion 客户端。它与 Windows Explorer 集成。您可以 此处下载。
进行存储库签出和源代码导出
现在我们必须签出 Mono 和 mcs 存储库,这意味着从特殊的 Subversion 服务器获取 Mono 和 mcs 源代码。
使用命令行客户端,通过在要获取源代码的目录中输入“svn co path-to-repository”来完成签出。使用 TortoiseSVN - 只需右键单击目录,选择 Checkout,然后输入存储库路径。
为源代码创建一些目录,并在其中创建两个名为 mono 和 mcs 的子目录。您需要大约 200M 的可用空间。
现在进行签出:svn://anonsvn.mono-project.com/source/trunk/mcs - 到 mcs,svn://anonsvn.mono-project.com/source/trunk/mono - 到 Mono。
注意:如果收到错误消息,请将地址中的“svn://”更改为“http://”。
签出过程相当漫长。
现在我们必须将接收到的源代码导出到 Cygwin 目录。导出意味着复制所有源代码文件,但不包括 Subversion 服务文件。命令行客户端通过在工作副本(您执行签出的目录)中执行以下命令来完成:
svn export . path-to-export
使用 TortoiseSVN - 从上下文菜单中完成。
将两个源目录分别导出到“c:/cygwin/download/mono/mono”和“c:/cygwin/download/mono/mcs”。如果使用 SVN,请不要创建目标目录;相反,在使用 TortoiseSVN 导出之前手动创建它们。
问题。默认情况下,您的 Subversion 客户端配置为使用 CRLF 行尾符(Windows 样式)。这将是一个问题,特别是对于一个文件 - mcs 存储库中的 mkinstalldirs。这个问题有两种解决方案:
- 如果您使用命令行客户端,请使用以下命令进行导出:
svn export . c:\cygwin\download\mono\mcs --native-eol LF
- 不幸的是,TortoiseSVN 不允许您指定导出开关。因此,在这种情况下,请在 Notepad++ 中打开“c:/cygwin/download/mono/mcs/mkinstalldirs”文件,然后单击“Format”>“Convert to UNIX format”。然后保存文件并关闭编辑器。
很好,我们已经准备好构建了。
构建
标准的构建过程包含三个步骤:
- 配置构建选项
- 构建(编译)
- 安装(复制编译后的文件)
首先,从 Cygwin bash shell,进入“/download/mono/mono”目录。键入:
./autogen.sh --prefix=C:/mono/Mono-x.x.x --with-preview=yes
(当然,请替换为您实际 Mono 安装的路径。)
诀窍在于,我们在 prefix 中使用了绝对 Windows 路径。prefix 指定了未来安装的根目录,使用此类路径可以正确地用新构建替换 Mono 安装。
该过程有点长,应该正确退出(没有错误消息)。
现在输入
make
这个过程确实很长(长达 2 小时),并且可能会崩溃。在我的机器上,它连续出现“mono incorrect operation”错误。好消息是,“make”过程在后续运行中不会尝试重新编译已编译的代码。
因此,如果您遇到此类错误,只需关闭错误消息并重复“make”操作,直到它正确退出。
太棒了,Mono 构建完成了(我花了整整两天来弄清楚所有这些隐藏的陷阱)。
最后键入:
make install
现在所有创建的文件都已复制到 prefix,即我们的 Mono 安装目录。
之后,键入“mono --version”并检查它是否与您下载的版本相符。另外,“tarball
”一词将出现在版本号之后。
恭喜!
历史
- 2007 年 7 月 12 日:初始版本