dotnet/runtime 如何构建 Mono 运行时(mono+libs)并找到生成的产品二进制?
2026/9/15 19:07:03 网站建设 项目流程

dotnet/runtime 如何构建 Mono 运行时(mono+libs)并找到生成的产品二进制?

【免费下载链接】runtime.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.项目地址: https://gitcode.com/GitHub_Trending/runtime6/runtime

在 dotnet/runtime 仓库中开发 Mono 时,你需要先把 Mono 运行时和 .NET 库一起构建出来,才能在本地跑代码、验证改动。本文的任务就是:在仓库根目录执行一次mono+libs构建,然后定位构建产出的产品二进制所在的artifacts\bin\mono目录,并了解构建失败时去哪里看日志、如何强制全量重编。以下内容基于仓库内的构建文档 docs/workflow/building/mono/README.md 与各平台依赖说明整理,适用于 Windows、Linux、macOS、FreeBSD。

准备:安装构建依赖

构建 Mono 前先按你的系统装好前置依赖。文档给出的各平台依赖清单分别是:

  • Linux:docs/workflow/requirements/linux-requirements.md
  • Windows:docs/workflow/requirements/windows-requirements.md
  • macOS:docs/workflow/requirements/macos-requirements.md
  • FreeBSD:docs/workflow/requirements/freebsd-requirements.md

以 Linux 为例,文档说明的最小内存要求是 1GB RAM(512MB 的虚拟机上构建已知会失败),并以 Ubuntu LTS 为例给出了apt安装命令:

# requires sudo for non-root user apt install -y cmake llvm lld clang build-essential \ python-is-python3 curl git lldb libicu-dev liblttng-ust-dev \ libssl-dev libkrb5-dev ninja-build pigz cpio

注意两点:这条命令需要 sudo(无 root 权限的用户要加sudo);cmake要求 3.26 或更新版本,Ubuntu 22.04 及更早版本、Debian 12 及更早版本的apt里版本不达标,需要按文档中的 CMake 章节改用snap install cmake或 Kitware APT feed。pigz是可选包,仅影响packs子集生成 tarball 时的并行压缩。

Linux 上还可以直接跑文档提供的依赖安装脚本(会修改系统包环境,需要 sudo),装完后建议手动核对依赖是否齐全:

# requires sudo for non-root user eng/common/native/install-dependencies.sh

执行 mono+libs 构建

构建完整运行时环境需要同时构建 Mono 运行时和库。在仓库根目录执行:

./build.sh mono+libs

Windows 上对应:

build.cmd mono+libs

根目录的 build.sh 会转发到eng/build.shmono+libs是构建系统定义的有效 subset 组合(见 eng/Subsets.props 中的DefaultSubsets配置)。

配置说明:

  • debug 是默认配置。产物包含断言、代码优化更少,便于调试。
  • 要测性能或让测试跑得更快,可加-configuration release(或简写-c release)构建没有这些检查的 release 版本。

如果你的改动只涉及 Mono 本身,文档还给出了两个精简路径:

# 只构建 mono(不需要重新构建完整环境时) ./build.sh mono # 只在 mono 上改动时跳过 NuGet 包恢复 ./build.sh mono --build

Windows 对应build.cmd monobuild.cmd mono --build

找到生成的产品二进制

构建完成后,文档明确给出产物位置:产品二进制会输出到artifacts\bin\mono\<OS>.<arch>.<flavor>目录。这里的<OS><arch><flavor>是文档的模板写法,分别按你实际的操作系统、机器架构和构建配置(如debug/release)落在具体目录名上。到仓库根目录下的artifacts/bin/mono/里按平台目录查找即可定位二进制。

另外两个相关的输出位置:

  • artifacts\obj\mono:构建把所有中间输出放在这里。删除该目录可以强制全量重编(注意这会清掉 Mono 的全部构建输出,下次构建会慢很多)。
  • artifacts\log:构建日志,构建失败时从这里排查。

常用构建参数

文档列出了对 Mono 构建有用的参数,按需追加:

参数用途
/p:MonoEnableLLVM=true使用 LLVM 构建 Mono
/p:MonoEnableLLVM=true /p:MonoLLVMDir=path/to/llvm从自定义路径使用 LLVM 构建(path/to/llvm替换为你本地的 LLVM 安装路径)
/p:MonoEnableLLVM=true /p:MonoLLVMDir=path/to/llvm /p:MonoLLVMUseCxx11Abi=true自定义路径 LLVM 且该 LLVM 以 C++11 ABI 构建
/p:DisableCrossgen=true跳过构建安装程序,构建更快(build.sh适用)
/p:KeepNativeSymbols=true符号保留在二进制内而不是剥离到单独文件,便于用 lldb 调试 Mono

更多选项可以直接用build -?查看帮助。

用 HelloWorld 样本验证构建结果

如果要跑库测试,或想用一个可执行样本来验证自己的改动,文档指定的构建入口是mono+libs.pretest

./build.sh mono+libs.pretest

Windows 对应build.cmd mono+libs.pretest

然后按文档步骤跑 HelloWorld 样本:样本位于 src/mono/sample/HelloWorld,从该目录执行:

cd ../.. make run

即回到src/mono目录后执行make run目标。

限制与已知事项

  • Mono 的测试二进制暂不可用(文档 Important Notes 原话:Test binaries are not yet available for mono),不要期待在产物里直接找到测试用二进制。
  • 构建失败时先看artifacts\log下的日志,而不是猜测原因。
  • 需要全量重编时删除的是artifacts\obj\mono,这一步会清除 Mono 的全部构建中间产物。

如果你接下来要打包 NuGet 包,文档给出的命令是./build.sh packs -runtimeFlavor mono(可加 release 配置),产物包会出现在artifacts\packages\<configuration>\Shipping下,包名形如Microsoft.NETCore.Runtime.Mono.<version>-dev.<number>.1.nupkg;WebAssembly、Android、iOS 平台的构建/测试则分别参见 docs/workflow/building/mono/README.md 中链接的对应文档。

【免费下载链接】runtime.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.项目地址: https://gitcode.com/GitHub_Trending/runtime6/runtime

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询