如何在Windows上构建Mono 3.4.0 / 3.4.1 / 3.6.1






4.67/5 (16投票s)
一篇关于如何在 Windows 上构建旧版 Mono 的更新文章
引言
注意:本文有一个更新版本,请点击此处查看,该版本涵盖了适用于Windows的Mono 3.8.0。
本文基于并更新了许多现有文章,这些文章试图描述在Windows上构建Mono的过程。
如果您只是想查找Mono 3.4.0的二进制文件,我已在此处提供了此演练生成的二进制文件此处。
Mono项目中的基础说明可以在此处找到。
理论上,这些应该足以编译Mono,但正如现实世界中一贯如此,事情要复杂一些。因此,其他人撰写了关于如何构建Mono的文章,我发现“在Windows上构建Mono:最后的战斗”特别有用。
话虽如此,这些文章已经有些年头了,我在构建Mono时遇到了一些问题,我已在下面的演练中尝试解决这些问题。
我们将探讨如何从当前(撰写本文时)的Mono发行版tarball(3.4.0)进行构建,以及如何从git仓库构建“最新最棒”的目录。
事件顺序如下:
- 安装预编译的Mono
- 安装和配置Cygwin
- 检索并解压tarball Mono源代码
- 构建Mono
- 修改Cygwin/Mono以解决任何构建失败
- 安装Mono并修改安装
- Xamarin Studio的修复/变通方法
- 检索并构建git Mono源代码
此演练已在运行Windows 8.1的x64机器上进行测试。
安装预编译的Mono二进制文件
您可以在此处下载Mono 3.2.3的稳定预编译版本。下载并安装。
通过从开始菜单打开Mono命令提示符并键入来检查其是否运行
mono --version
您应该会看到Mono启动并显示3.2.3版本。
C:\Program Files (x86)\Mono-3.2.3>mono --version
Mono JIT compiler version 2.10.9 (tarball)
Copyright (C) 2002-2011 Novell, Inc, Xamarin, Inc and Contributors. www.mono-pro
ject.com
TLS: normal
SIGSEGV: normal
Notification: Thread + polling
Architecture: x86
Disabled: none
Misc: softdebug
LLVM: supported, not enabled.
GC: Included Boehm (with typed GC and Parallel Mark)
C:\Program Files (x86)\Mono-3.2.3>
安装Cygwin
下载并安装Cygwin的32位版本,这是一个Unix-on-Windows工具集,Mono构建系统使用它。安装引导程序可以在此处找到。
在安装过程中,您将可以选择指定所需的软件包。用于构建Mono的软件包默认未安装,因此请确保选择所有这些软件包。
在Windows上构建Mono的说明提供了更深入的细节,并指出我们需要以下内容:
autoconf, automake,bison, gcc-core, gcc-g++,mingw-gcc, libtool, make, python,
“最后的战斗”说明表明我们还需要安装一些其他软件包。
gettext-devel, gettext, intltool, libiconv, pkg-config
其他可选的软件包有:
wget, zip patch, openssh, vim
配置Cygwin
我已在mono-dev邮件列表中建议,Cygwin需要配置为以“noacl
”选项挂载主机系统驱动器,否则可能会出现文件访问问题。有关详细信息,请参阅此处和此处。
遵循这些说明,从开始菜单打开Cygwin终端并编辑/etc/fstab文件。
# For a description of the file format, see the Users Guide
# http://cygwin.com/cygwin-ug-net/using.html#mount-table
# This is default anyway:
none /cygdrive cygdrive binary,posix=0,user 0 0
如下所示添加noacl
选项:
# For a description of the file format, see the Users Guide
# http://cygwin.com/cygwin-ug-net/using.html#mount-table
# This is default anyway:
none /cygdrive cygdrive binary,noacl,posix=0,user 0 0
然后,您可能希望关闭并重新打开Cygwin终端以确保此更改生效。您可以通过运行“mount
”命令来查看更改,以便在输出中看到“noacl
”选项。
检索Mono发行版tarball
撰写本文时,最新的Mono源代码发行版tarball是3.4.0。此版本没有Windows安装程序,最新的为3.2.3。我们将在此处构建一套可用的Mono 3.4.0二进制文件。
从此处的链接检索Mono 3.4.0源代码。将其解压到您的文件系统中。
您应该在Cygwin中检索并解压文件。也可以在Cygwin外部检索和解压文件,但如果不小心,您可能会发现行尾符(CRLF)已被修改,这将导致构建问题。
所以,请打开Cygwin终端。
$ cd /cygdrive/c $ mkdir monosources$ cd monosources
$ wget http://download.mono-project.com/sources/mono/mono-3.4.0.tar.bz2
$ tar xjvf mono-3.4.0.tar.bz2
注意:将源代码放在相对较短的路径中非常重要,否则您可能会遇到Windows MAX_PATH
限制问题(感谢mpderbec)。此外,据报道,以用户名包含空格的Windows用户进行构建可能会导致问题。
从Mono发行版tarball构建
构建Mono时可能会出现构建错误,例如缺少文件或与Cygwin头文件冲突。当出现错误时,我们将按照后续说明进行处理,但现在,我们将开始构建Mono,看看能进展到哪一步。
我们将为Mono 3.4.0安装创建一个目标文件夹,并将构建配置为将来安装到该文件夹,所以:
$ cd /cygdrive/c
$ mkdir monoinstall
$ cd monosources/mono-3.4.0
$ ./autogen.sh --prefix="C:\monoinstall" --with-preview=yes
注意:我们使用的是Win32路径说明符格式的--prefix
,而不是Cygwin/*nix
格式。
Autogen应该会成功完成,然后我们按照autogen的建议配置构建:
$ ./configure --host=i686-pc-mingw32
在配置过程结束时,我们应该会看到类似以下的内容:
mcs source: mcs
Engine:
GC: sgen and bundled Boehm GC with typed GC and parallel mark
TLS: pthread
SIGALTSTACK: no
Engine: Building and using the JIT
oprofile: no
BigArrays: no
DTrace: no
LLVM Back End: no (dynamically loaded: no)
Libraries:
.NET 2.0/3.5: yes
.NET 4.0: yes
.NET 4.5: yes
MonoDroid: no
MonoTouch: no
Xamarin.Mac: no
JNI support: no
libgdiplus: assumed to be installed
zlib:
配置成功后,我们就可以开始正式构建了,使用:
$ make
构建失败 #1 - PEXECUTION_STATE
第一次构建失败是由于Mono定义的PEXECUTION_STATE
与Cygwin定义的同名变量之间的交互引起的。这会导致构建失败,错误输出类似如下:
/usr/i686-pc-mingw32/sys-root/mingw/include/ddk/ntapi.h:49:15:
error: conflicting types for 'PEXECUTION_STATE'
In file included from
/usr/i686-pc-mingw32/sys-root/mingw/include/windows.h:62:0,
from
/usr/i686-pc-mingw32/sys-root/mingw/include/winsock2.h:40,
from ../../mono/io-layer/io-layer.h:24,
from ../../mono/metadata/domain-internals.h:15,
from ../../mono/metadata/metadata-internals.h:8,
from ../../mono/metadata/class-internals.h:10,
from ../../mono/metadata/object-internals.h:8,
from process.c:16:
推荐的解决方法是编辑Cygwin中的Cygin头文件,将PEXECUTION_STATE
的定义更改为其他名称,例如:
$ nano /usr/i686-pc-mingw32/sys-root/mingw/include/ddk/ntapi.h
更改
/* FIXME: Unknown definitions */
typedef PVOID POBJECT_TYPE_LIST;
typedef PVOID PEXECUTION_STATE;
typedef PVOID PLANGID;
修改为:
/* FIXME: Unknown definitions */
typedef PVOID POBJECT_TYPE_LIST;
typedef PVOID PEXECUTION_STATE_WORKAROUND;
typedef PVOID PLANGID;
现在再次使用以下命令启动构建过程:
$ make
安装构建的Mono文件
构建成功完成后,您就可以安装到目标文件夹了。
首先,我们需要在Cygwin中挂载该文件夹,使用:
$ mount "C:\monoinstall" /usr/local
注意:我发现如果在前面的构建过程中挂载了它,我就会遇到与libiconv
相关的错误。这可能可以用“noacl
”修复来解决,但目前建议是在make成功完成后,准备安装时再进行挂载。
安装失败 #2 - 缺少目标文件
Mono 3.4.0发行版tarball中缺少一个文件。有关详细信息,请参阅此处。
您需要手动添加此文件,方法是创建一个文件:
$ nano mcs/tools/xbuild/targets/Microsoft.Portable.Common.targets
该文件应包含以下内容:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\Microsoft.Portable.Core.props" />
<Import Project="..\Microsoft.Portable.Core.targets" />
</Project>
安装文件
$ make install
修复:安装问题 - mono.exe
出于某种原因,安装程序没有将Win32可执行文件mono.exe复制过来。
这似乎是一个存根函数,可以从您现有的Mono安装中复制过来,例如:
copy C:\Program Files (x86)\Mono-3.2.3\bin\mono.exe to C:\monoinstall\bin
有了此修复后,您现在可以在Windows下执行Mono并检查版本是否正确。打开Windows命令框并键入:
cd c:\monoinstall\bin
mono --version
您应该会看到类似以下内容
Mono JIT compiler version 3.4.0 (tarball)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
TLS: normal
SIGSEGV: normal
Notification: Thread + polling
Architecture: x86
Disabled: none
Misc: softdebug
LLVM: supported, not enabled.
GC: sgen
修复:Xamarin Studio - 额外的符号链接文件阻止添加运行时
如果您现在尝试使用**工具**->**选项**、**项目**->**.NET运行时**将此Mono 3.4.0运行时添加到Xamarin Studio。添加将失败,并出现错误消息“**找不到Mono运行时**”。
这是因为安装过程中复制了一个额外的符号链接文件。
您可能无法在Windows资源管理器或命令框的dir命令中看到它,尽管dir /a应该可以显示它。
如果您在Windows下删除时遇到问题,请使用Cygwin终端并输入:
$ cd /cygdrive/monoinstall/bin
$ rm mono
现在您应该能够将运行时添加到Xamarin Studio了。
变通方法:Xamarin Studio下构建项目的问题
- Mono 3.x在最近的Xamarin Studio版本中无法为我构建项目。给出的错误是:
Build failed. Could not find type 'System.Globalization.SortVersion'.
这似乎在以下commit中得到了解决,但该commit不在3.4.0中。
变通方法是使用旧版本的Xamarin Studio,如此处讨论的。
即,从您在Xamarin.com上的账户下载Xamarin Studio 4.2.3,选择“查看所有版本”。
- 然后您可能会收到一个关于UNC路径的构建错误:
Error: Error building target GetReferenceAssemblyPaths: UNC paths should be of the form \\server\share
这似乎与配置文件中的额外反斜杠有关,如此处讨论的。
变通方法是转到项目选项,取消选中“**使用MSBuild引擎**”,然后您将能够编译和调试应用程序。
从git仓库构建Mono
撰写本文时,事件顺序与从3.4.0发行版tarball构建类似。随着时间的推移,现有的构建问题可能会得到解决,也可能会出现新的构建问题,因此我的建议是,您首先尝试检出与本演练中使用过的git哈希相同的哈希,验证该构建(3.4.1),然后尝试在检出master后再次进行。
如上所述,您需要安装Cygwin软件包,并修改PEXECUTION_STATE
。
打开Cygwin终端并执行:
$ cd /cygdrive/c/monosources
$ git clone git://github.com/mono/mono.git
我们正在使用git checkout 079c2e126f594c5a338a779c72a899951de38960
。
您也可以选择使用以下命令检出:
$ cd mono
$ git checkout 079c2e126f594c5a338a779c72a899951de38960
确保/usr/local未被挂载,否则您可能会遇到与libiconv
相关的构建失败。
$ umount /usr/local
然后设置并启动构建:
$ ./autogen.sh --prefix="C:\monoinstall" --with-preview=yes
$ ./configure --host=i686-pc-mingw32
$ make
注意:如果您使用的是截至2014年6月10日的最新Mono源代码,还需要一个额外的步骤来下载monolite(感谢@Mangolce的报告)。
$ ./autogen.sh --prefix="C:\monoinstall" --with-preview=yes
$ ./configure --host=i686-pc-mingw32
$ make get-monolite-latest
$ make
构建后,您需要挂载/usr/local,安装文件,添加mono.exe并删除symlink
,如上所述。
$ mount "C:\monoinstall" /usr/local
$ make install
$ cd /cygdrive/c/monoinstall/bin
$ rm mono
$ cp /cygdrive/c/Program Files (x86)/Mono-3.2.3/bin/mono.exe /cygdrive/c/monoinstall/bin
此时,您应该拥有最新最棒的Mono,准备运行!您可以打开Windows命令框并输入:
C:\> cd c:\monoinstall\bin
C:\monoinstall\bin> mono --version
现在,您可能希望在Cygwin终端中检出git master,并构建最新的Mono源代码。
$ cd /cygdrive/c/monosources/mono
$ git checkout master
反馈
我打算在新版本的Mono发布时,尽力维护和更新本文档。
请随时通过在下方留言的方式,将您的所有更正、问题和评论反馈给我。
历史
- 2014年5月11日:首次发布
- 2014年6月10日:在从git仓库使用当前源代码时添加了get-monolite-latest步骤。