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+libsWindows 上对应:
build.cmd mono+libs根目录的 build.sh 会转发到eng/build.sh,mono+libs是构建系统定义的有效 subset 组合(见 eng/Subsets.props 中的DefaultSubsets配置)。
配置说明:
- debug 是默认配置。产物包含断言、代码优化更少,便于调试。
- 要测性能或让测试跑得更快,可加
-configuration release(或简写-c release)构建没有这些检查的 release 版本。
如果你的改动只涉及 Mono 本身,文档还给出了两个精简路径:
# 只构建 mono(不需要重新构建完整环境时) ./build.sh mono # 只在 mono 上改动时跳过 NuGet 包恢复 ./build.sh mono --buildWindows 对应build.cmd mono和build.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.pretestWindows 对应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),仅供参考