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

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (16投票s)

2014 年 5 月 11 日

CPOL

8分钟阅读

viewsIcon

43550

一篇关于如何在 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下构建项目的问题

  1. 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,选择“查看所有版本”。

  2. 然后您可能会收到一个关于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步骤。
© . All rights reserved.