65.9K
CodeProject 正在变化。 阅读更多。
Home

如何在 Windows 上构建 Mono 3.8 / 3.10

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (15投票s)

2014 年 9 月 5 日

CPOL

8分钟阅读

viewsIcon

61088

一篇关于如何在 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 构建的说明
© . All rights reserved.