如何在 Windows 上构建 Mono 3.8 / 3.10






4.93/5 (15投票s)
一篇关于如何在 Windows 上构建当前版 Mono 的更新文章
引言
更新:我现在可以在 Appveyor CI 平台以自动化方式构建 Mono。为此,创建了一个配置脚本,Appveyor 使用该脚本来安装依赖项、运行 autogen、配置、编译和安装 Mono。生成的二进制文件将作为构件打包,以便进行进一步的测试和使用。有关更多详细信息,请参阅此 Appveyor 项目和配置 脚本。
如果您只是在寻找 Mono 3.8.0 二进制文件来使用,我已经在此处提供了此教程生成的二进制文件。
如果您在寻找 Mono 3.10.0 二进制文件来使用,我已经在此处提供了此教程生成的二进制文件。
本文基于并更新了许多现有文章,这些文章试图描述在 Windows 上构建 Mono 的过程。
这摘自我之前的文章 这里,其中涵盖了 Mono 3.4.0 - 3.6.1 的构建。较旧的文章对于希望构建旧版 Mono 的用户仍可能有用,因此,我并未更新它,而是将其核心内容提取并更新到本文中。
Mono 项目的基线说明可以在此处找到。
理论上,这些应该足以编译 Mono,但现实世界中,事情总是会更复杂一些。因此,其他人写了一些关于如何构建 Mono 的文章,我发现 “在 Windows 上构建 Mono:最终战役”特别有用。
尽管如此,这些文章已经写了好几年了,我在构建 Mono 时遇到了一些问题,我已在下面的教程中尝试解决这些问题,
我们将探讨如何从当前(截至撰写本文时)的 Mono 发布 tarball(3.8.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-runtime, 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.8.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.8.0.tar.bz2
$ tar xjvf mono-3.4.0.tar.bz2
注意:重要的是要将您的源代码放在相对较短的路径中,否则您可能会遇到 Windows MAX_PATH
限制问题(感谢 mpderbec)。此外,据报告,以用户名中包含空格的 Windows 用户进行构建可能会导致问题。
从 Mono 发布 tarball 进行构建
注意:以下步骤引用了 3.8.0,但适用于 3.10.0。然而,截至 2014 年 10 月 17 日,3.10.0 发布时 Windows 构建存在问题,因此请确保执行额外的步骤来修补该问题。
构建 Mono 时可能会出现构建错误,例如文件丢失或与 Cygwin 头文件冲突。当出现错误时,我们将按照后续说明进行处理,但现在我们先开始构建 Mono,看看能进行到什么程度。
我们将创建一个目标文件夹用于安装 Mono 3.8.0,并配置构建以便将来安装到该文件夹,所以
$ cd /cygdrive/c
$ mkdir monoinstall
$ cd monosources/mono-3.8.0
$ ./autogen.sh --prefix="C:\monoinstall" --with-preview=yes
注意:我们使用的是 Win32 路径说明符格式的 --prefix,而不是 Cygwin/*nix 格式。
Autogen 应该会成功完成,然后我们按照 autogen 的建议配置构建。
$ ./configure --host=i686-pc-mingw32
在配置过程结束时,我们应该会看到类似以下的内容
mcs source: mcs
Engine:
Host: i686-pc-mingw32
Target: i686-pc-mingw32
GC: sgen and Included 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
修复:Mono 3.10.0 - 补丁 mono/utils/sha1.h
Mono 3.10.0 发布版本(截至 2014 年 10 月 17 日)会因以下错误而失败
libtool: compile: i686-pc-mingw32-gcc -DHAVE_CONFIG_H -I. -I../.. -I../.. -I../../mono -I../../libgc/include -I../../eglib/src -I../../eglib/src -DWINVER=0x0502 -D_WIN32_WINNT=0x0502 -D_WIN32_IE=0x0501 -D_UNICODE -DUNICODE -DWIN32_THREADS -DFD_SETSIZE=1024 -g -O2 -fno-strict-aliasing -fwrapv -Wdeclaration-after-statement -Wno-unused-but-set-variable -g -Wall -Wunused -Wmissing-prototypes -Wmissing-declarations -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Wpointer-arith -Wno-cast-qual -Wwrite-strings -Wno-switch -Wno-switch-enum -Wno-unused-value -mno-tls-direct-seg-refs -Werror-implicit-function-declaration -MT sha1.lo -MD -MP -MF .deps/sha1.Tpo -c sha1.c -DDLL_EXPORT -DPIC -o .libs/sha1.o In file included from sha1.c:20:0: ./sha1.h:25:1: error: expected '=', ',', ';', 'asm' or '__attribute__'
需要对 mono/utils/sha1.h 进行更改以修复此问题
编辑文件,将 __BEGIN_DECLS 更改为 G_BEGIN_DECLS,将 _END_DECLS 更改为 G_END_DECLS
G_BEGIN_DECLS void SHA1Init(SHA1_CTX *); void SHA1Pad(SHA1_CTX *); void SHA1Transform(guint32 [5], const guint8 [SHA1_BLOCK_LENGTH]); void SHA1Update(SHA1_CTX *, const guint8 *, size_t); void SHA1Final(guint8 [SHA1_DIGEST_LENGTH], SHA1_CTX *); char *SHA1End(SHA1_CTX *, char *); char *SHA1File(const char *, char *); char *SHA1FileChunk(const char *, char *, off_t, off_t); char *SHA1Data(const guint8 *, size_t, char *); G_END_DECLS
安装构建的 Mono 文件
构建成功完成后,您可以继续安装到目标文件夹。
首先,我们需要在 Cygwin 中挂载该文件夹,使用
$ mount "C:\monoinstall" /usr/local
注意:我发现如果在之前的构建过程中挂载了该文件夹,则会出现与 libiconv
相关的错误。这可以通过“noacl
”修复来解决,但目前建议直到 make
成功完成且我们准备好安装时再进行挂载。
安装文件
$ 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.8.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 - 额外的符号链接文件阻止添加运行时
如果您现在尝试使用 Tools->Options, Projects->.NET Runtimes, Add 将此 Mono 3.8.0 运行时添加到 Xamarin Studio,则会因错误消息“Mono runtime not found”而失败。
这是因为安装过程中复制了一个额外的符号链接文件。
您可能无法在 Windows 资源管理器或命令框中的 dir
中看到它,但 dir /a
应该可以显示它。
如果无法在 Windows 下删除,则使用 Cygwin 终端并输入
$ cd /cygdrive/monoinstall/bin
$ rm mono
您现在应该可以将运行时添加到 Xamarin Studio 了。
变通方法:在 Xamarin Studio 中构建项目时遇到的问题
(1) 您可能会因为缺少 mcs.bat 文件而导致构建失败,例如
Build failed. The specified executable is not a valid application for this OS platform.
如果出现这种情况,您需要删除安装文件夹中的 mcs 文件,并将 mcs.bat 文件从您现有的 Mono 安装中复制过来。
$ cd /cygdrive/monoinstall/bin
$ rm mcs
$ cp /cygdrive/c/Program Files (x86)/Mono-3.2.3/bin/mcs.bat /cygdrive/c/monoinstall/bin
(2) 您可能会收到有关 UNC 路径的构建错误
error : Error building target GetReferenceAssemblyPaths: UNC paths should be of the form \\server\share
这似乎与配置文件中多余的 \\ 有关,如此处讨论的。
变通方法是转到项目选项并取消选中“Use MSBuild engine”,这样您就可以编译和调试应用程序了。
从 git 仓库构建 Mono
截至撰写本文时,事件顺序与从 3.8.0 发布 tarball 构建类似。随着时间的推移,现有的构建问题可能会得到解决,也可能会出现新的构建问题,因此我的建议是,您首先检查此教程中使用的 git hash,验证构建(3.8.x),然后尝试在检出 master 后再次进行。
如上所述,您需要安装 Cygwin 软件包,并进行 PEXECUTION_STATE
的修改。
打开 Cygwin 终端并
$ cd /cygdrive/c/monosources
$ git clone git://github.com/mono/mono.git
我们正在处理 git checkout 813d6610ecafd24e5cf428938b342810d70d5c25
。
您也可以选择使用以下命令进行签出
$ cd mono
$ git checkout 813d6610ecafd24e5cf428938b342810d70d5c25
确保 /usr/local 未被挂载,否则您可能会遇到与 libiconv
相关的构建失败。
$ umount /usr/local
然后设置并启动构建
$ ./autogen.sh --prefix="C:\monoinstall" --with-preview=yes
$ ./configure --host=i686-pc-mingw32
$ make
构建后,您需要挂载 /usr/local,安装文件,添加 mono.exe 并删除符号链接,如上所述。此外,您还需要删除 mcs 并添加 mcs.bat。
$ 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
$ rm mcs
$ cp /cygdrive/c/Program Files (x86)/Mono-3.2.3/bin/mcs.bat /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日 首次发布(构建 Mono 3.4)
- 2014年6月10日 添加了在使用 git 仓库当前源码时获取 latest-monolite 的步骤
- 2014年9月5日 发布“构建 Mono 3.8”,基于 Mono 3.4 文章
- 2014年10月17日 添加了用于构建 Mono 3.10 的修复
- 2014年10月27日 添加了关于 Appveyor 构建的说明