dotnet/runtime Linux 构建环境搭建指南:依赖清单、交叉编译工具与 Docker 方案详解
2026/9/19 12:53:48 网站建设 项目流程

dotnet/runtime Linux 构建环境搭建指南:依赖清单、交叉编译工具与 Docker 方案详解

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

导读

本文基于 dotnet/runtime 仓库的 linux-requirements.md,系统梳理在 Linux 上搭建 .NET 运行时(Runtime)构建环境的完整方案:包括 Debian/Ubuntu、Fedora、Gentoo 等主流发行版的依赖安装清单、CMake 版本兼容性处理、WASM 交叉构建所需的 Clang 版本要求、跨架构/跨平台交叉编译的额外工具,以及使用官方 Docker 镜像直接构建的替代路径。读完本文,你将能够在自己的 Linux 机器上从零配置好 dotnet/runtime 的构建环境,并理解各依赖项在仓库构建流程中的实际作用。

两种构建环境方案概述

在 Linux 上构建 dotnet/runtime 仓库(即dotnet/runtime源码树,本仓库的根目录即为其工作区),官方文档给出了两条路线:

  1. 在自己的 Linux 机器上直接搭建环境:适合需要灵活控制工具链、需要在同一环境中使用其他开发工具的开发者;
  2. 使用官方构建所用的 Docker 镜像:利用微软官方预先配置好的构建镜像,免去手动安装依赖的繁琐步骤。

两种方式各有优劣:Docker 方案开箱即用、环境与 CI 一致,但灵活性受限;自建环境则可自由组合工具链。若你使用的是WSL(Windows Subsystem for Linux),则直接按照其中所装发行版(distro)对应的章节操作即可,Docker 桌面版在 Windows 上的 Linux 容器同样依托 WSL 运行。

硬件底线:官方要求最低 1GB 内存(已知在 512MB 的虚拟机上构建会失败,相关记录见仓库 issues 讨论),且建议配置更高,否则构建耗时极长。

使用辅助脚本一键安装依赖

仓库在 eng/common/native/install-dependencies.sh 提供了一个跨发行版的依赖安装脚本,可用于 CI 与本地环境:

# 非 root 用户需要加 sudo eng/common/native/install-dependencies.sh

该脚本的核心逻辑如下(eng/common/native/install-dependencies.sh):

  • 若未显式传入 OS 参数,会先通过 init-os-and-arch.sh 用uname -s自动探测系统类型与 CPU 架构(x64、arm64、riscv64、ppc64le 等);
  • 读取/etc/os-release中的ID/ID_LIKE字段,按发行版分支执行对应的包管理器命令:
    • Debian 系(debian/ubuntu):apt install build-essential gettext locales cmake llvm clang lld lldb liblldb-dev libunwind8-dev libicu-dev liblttng-ust-dev libssl-dev libkrb5-dev pigz cpio ninja-build file,并额外调用localedef生成en_US.UTF-8locale;
    • Fedora/RHEL/Azure Linux/CentOS:优先使用tdnf,否则退回dnf,安装cmake llvm lld lldb clang python curl libicu-devel openssl-devel krb5-devel lttng-ust-devel pigz cpio ninja-build file
    • Amazon Linuxamzn):与 RHEL 系包列表基本一致;
    • Alpine:使用apk add安装build-base cmake bash curl clang llvm llvm-dev lld lldb-dev krb5-dev lttng-ust-dev icu-dev openssl-dev pigz cpio ninja file

脚本以set -e运行,遇到不支持的发行版会直接报错退出。官方建议:即使使用脚本,也最好手动核对关键依赖(尤其是 cmake、clang 版本)是否真正满足要求。

Debian 与 Ubuntu 的依赖清单

以下说明以当前Ubuntu LTS版本为基准撰写。需要安装的包如下:

包名用途说明
build-essential提供 gcc/g++ 与 make 等基础编译工具链
clangC/C++ 编译器,参与 native 组件构建;若做 WASM 相关开发需参见下方专节
cmake构建系统生成器,要求3.26 或更新版本
cpio归档工具,用于构建过程中解包/打包
curl下载构建依赖与工具链
git源码版本管理(仓库克隆与子模块)
libicu-devICU 国际化库开发头文件,.NET 全球化功能依赖
libkrb5-devKerberos 认证库,用于 System.Net.Security 等
liblttng-ust-devLTTng 用户态跟踪库,支撑 .NET 事件跟踪(EventPipe)相关功能
libssl-devOpenSSL 开发头文件,TLS 与加密功能依赖
lldLLVM 链接器,用于 native 构建链接
lldbLLVM 调试器,用于调试 native 代码
llvmLLVM 工具链,供编译与工具使用
ninja-build高性能构建系统,配合 CMake 使用
pigz(可选)并行 gzip 压缩,为packssubset 打 tarball 加速
python-is-python3python命令指向 Python 3,供仓库内构建脚本使用

一次性安装命令(非 root 用户加sudo):

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

版本红线:如果你运行的是早于 Ubuntu 22.04 LTS的 Ubuntu,或早于 Debian 12的 Debian,不要直接用 apt 安装 cmake,请按下一节处理。

老版本 Ubuntu/Debian 上的 CMake 安装

截至文档撰写时,Ubuntu 22.04 LTS 的 apt 源中 CMake 只到 3.22(更老的 Ubuntu 更低),Debian 12 中是 3.25.1,均低于仓库要求的3.26,无法直接兼容 dotnet/runtime 的构建系统(仓库中 native 组件的 CMakeLists.txt 即声明了cmake_minimum_required(VERSION 3.26),eng/native/configurecompiler.cmake 中也有基于CMAKE_VERSION的版本分支逻辑)。两条替代安装路径:

方案一:通过 snap 安装新版 CMake

# 非 root 用户需要加 sudo snap install cmake

snap 渠道提供比系统源更新的 CMake 版本,安装后cmake命令即指向新版。

方案二:使用 Kitware 官方 APT 源

按 Kitware 官方指引添加其 APT feed(源地址包含apt.kitware.com),随后即可通过apt安装满足 3.26 及以上版本的 CMake。由于仓库无法直接依赖系统源中的旧版本,建议优先采用此方案以获得更贴近发行版习惯的包管理体验。

WASM 构建所需的 Clang

WASM(WebAssembly)构建对 Clang 的最低要求是 16,文档撰写时最新为 18。若使用 Ubuntu 22.04 LTS 或更老版本,系统源中的 Clang 版本不足,需要额外添加 LLVM 官方仓库:

# 非 root 用户需要加 sudo add-apt-repository -y "deb http://apt.llvm.org/$(lsb_release -s -c)/ llvm-toolchain-$(lsb_release -s -c)-18 main" apt update -y apt install -y clang-18

命令中的$(lsb_release -s -c)会自动展开为当前发行版代号,从而匹配对应的llvm-toolchain-<codename>-18软件源。另一个现成的环境示例是仓库中的 .devcontainer/Dockerfile:它基于mcr.microsoft.com/devcontainers/dotnet镜像,并在构建阶段下载执行install-dependencies.shinit-os-and-arch.sh来完成同样的依赖装配。

交叉编译(Cross Building)的额外工具

如果你的目标是从 Linux 交叉编译到其他 CPU 架构(如 Arm32、Arm64)或其他操作系统(如 Alpine、FreeBSD),还需要额外安装以下软件包:

  • binfmt-support:内核 binfmt 机制支持,用于执行不同格式的二进制(配合 qemu-user);
  • debootstrap:构建最小化 rootfs(crossrootfs)的工具;
  • qemu:QEMU 模拟器;
  • qemu-user-static:用户态静态 QEMU,用于在 x64 主机上运行 Arm 等架构的二进制。
apt install binfmt-support debootstrap qemu qemu-user-static

需要强调的是,这些包用于构建crossrootfs(交叉编译所需的根文件系统),而非构建 runtime 本身。仓库在 eng/common/cross/ 目录下提供了build-rootfs.shbuild-android-rootfs.shtizen-build-rootfs.sh等脚本以及 arm64、armel、riscv64、x64 等架构子目录,配合 toolchain.cmake 完成 crossrootfs 的生成与工具链切换。构建时通过ROOTFS_DIR环境变量指向生成的 rootfs(详见本文 Docker 一节),从而完成跨架构编译。

Fedora 上的依赖安装

以下说明以Fedora 40为基准。需要安装的工具链包:

  • clang
  • cmake
  • cpio
  • curl
  • git
  • krb5-devel
  • libicu-devel
  • lld
  • lldb
  • llvm
  • lttng-ust-devel
  • ninja-build
  • openssl-devel
  • pigz(可选,为packssubset 的 tarball 启用并行 gzip 压缩)
  • python

一次性安装命令(非 root 用户加sudo):

dnf install -y cmake llvm lld lldb clang python curl git \ libicu-devel openssl-devel krb5-devel lttng-ust-devel ninja-build pigz cpio

与 Debian 系相比,Fedora 的头文件包命名使用-devel后缀(如libicu-developenssl-develkrb5-devellttng-ust-devel),Python 直接提供python包名,无需python-is-python3这类别名包。

Gentoo 上的依赖安装

Gentoo 用户可执行如下命令安装核心依赖:

emerge --ask clang dev-util/lttng-ust app-crypt/mit-krb5

即安装 Clang 编译器、LTTng 用户态跟踪库(dev-util/lttng-ust)与 MIT Kerberos 库(app-crypt/mit-krb5)。由于 Gentoo 采用源码式包管理(Portage),其余依赖(cmake、ninja、ICU 等)通常已在系统中就绪或可通过 USE flag 组合满足,仓库官方文档也欢迎社区提交其他发行版/环境的需求说明文档(Pull Request)。

使用 Docker 镜像构建

准备 Docker Engine

使用 Docker 方案前,需先安装 Docker Engine(安装二进制与指引见 Docker 官方站点)。安装完成后即可按照仓库的 docs/workflow/using-docker.md 文档操作。Docker 方案的优势在于:宿主机的操作系统种类不再重要——例如在 Ubuntu 22.04 上可以毫无障碍地使用 Ubuntu 18.04 镜像;Windows 上启用 WSL 后同样可运行 Linux 容器。需要注意的是:

  • 同一个 Docker Daemon 无法同时运行多个不同内核体系的容器(如 Linux 容器与 Windows 容器需切换并重启 Docker);
  • 镜像架构必须与宿主机支持的平台匹配:例如 Apple Silicon Mac 可通过 Rosetta 模拟运行 x64 与 Arm64 镜像;Linux Arm64 主机可运行 Arm32 镜像;
  • Windows 上虽然 Docker 依赖 WSL 运行 Linux 容器,但无需进入 WSL 终端,任何装有docker命令的 cmd/powershell 终端都可直接操作。

官方构建镜像一览

以下镜像(mcr.microsoft.com/dotnet-buildtools/prereqs前缀)是官方 CI 使用的预构建环境,其中crossrootfs dir一列对应容器内ROOTFS_DIR应指向的路径:

主要镜像(覆盖绝大多数常规构建场景)

宿主机 OS目标 OS目标架构镜像 tagcrossrootfs 目录
Azure Linux (x64)Alpine 3.17x64azurelinux-3.0-net11.0-cross-amd64-musl/crossrootfs/x64
Azure Linux (x64)Ubuntu 18.04x64azurelinux-3.0-net11.0-cross-amd64/crossrootfs/x64
Azure Linux (x64)Alpine 3.17Arm32 (armhf)azurelinux-3.0-net11.0-cross-arm-musl/crossrootfs/arm
Azure Linux (x64)Ubuntu 22.04Arm32 (armhf)azurelinux-3.0-net11.0-cross-arm/crossrootfs/arm
Azure Linux (x64)Alpine 3.17Arm64 (arm64v8)azurelinux-3.0-net11.0-cross-arm64-musl/crossrootfs/arm64
Azure Linux (x64)Ubuntu 18.04Arm64 (arm64v8)azurelinux-3.0-net11.0-cross-arm64/crossrootfs/arm64
Azure Linux (x64)Ubuntu 18.04x86azurelinux-3.0-net11.0-cross-x86/crossrootfs/x86

扩展镜像(针对 Android、RISC-V 等特殊场景)

宿主机 OS目标 OS目标架构镜像 tagcrossrootfs 目录
Azure Linux (x64)Android Bionicx64azurelinux-3.0-net11.0-cross-android-amd64N/A
Azure Linux (x64)Android Bionic(含 OpenSSL)x64azurelinux-3.0-net11.0-android-opensslN/A
Azure Linux (x64)Android Bionic(含 Docker)x64azurelinux-3.0-net11.0-android-dockerN/A
Azure Linux (x64)FreeBSD 14x64azurelinux-3.0-net11.0-cross-freebsd-14/crossrootfs/x64
Azure Linux (x64)Ubuntu 18.04PPC64leazurelinux-3.0-net11.0-cross-ppc64le/crossrootfs/ppc64le
Azure Linux (x64)Ubuntu 24.04RISC-Vazurelinux-3.0-net11.0-cross-riscv64/crossrootfs/riscv64
Azure Linux (x64)Debian sidLoongArchazurelinux-3.0-net11.0-cross-loongarch64/crossrootfs/loongarch64
Azure Linux (x64)Ubuntu 18.04S390xazurelinux-3.0-net11.0-cross-s390x/crossrootfs/s390x
Azure Linux (x64)Ubuntu 18.04 (Wasm)x64azurelinux-3.0-net11.0-webassembly-amd64/crossrootfs/x64
Debian (x64)Debian 13x64debian-13-gcc16-amd64N/A
Ubuntu (x64)Tizen 9.0Arm32 (armel)ubuntu-22.04-cross-armel-tizen/crossrootfs/armel

用 docker run 构建仓库

选定镜像后,即可通过docker run挂载仓库源码并执行构建脚本。官方示例(以 Azure Linux 镜像交叉编译 x64 目标为例):

docker run --rm \ -v <RUNTIME_REPO_PATH>:/runtime \ -w /runtime \ -e ROOTFS_DIR=/crossrootfs/x64/ \ mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net11.0-cross-amd64 \ ./build.sh -s clr --cross -c Checked

逐项拆解各参数的含义:

  • --rm:容器运行结束后自动删除;
  • -v <RUNTIME_REPO_PATH>:/runtime:将本机仓库克隆目录挂载到容器内/runtime路径;
  • -w /runtime:容器工作目录设为/runtime
  • -e ROOTFS_DIR=/crossrootfs/x64/:设置交叉构建所需的环境变量,指向容器内预置的 crossrootfs;
  • mcr.microsoft.com/dotnet-buildtools/prereqs:azurelinux-3.0-net11.0-cross-amd64:要拉取的镜像全名,此处即使用 Azure Linux 镜像构建 x64 目标;
  • ./build.sh -s clr --cross -c Checked:在仓库内执行的构建命令——构建Clrsubset、Checked配置,并开启交叉编译选项。

如果需要进入容器交互式操作(例如在同一路径下执行多次不同配置的构建),可将末尾的构建命令替换为-it标志,即可获得容器内的小型 shell。不过容器内置 shell 的工具非常有限(仅够执行基本操作),不适合作为日常完整开发环境。

构建入口与后续指引

完成环境搭建后,仓库根目录下的 build.sh(Linux/macOS)与 dotnet.cmd(Windows)即为统一构建入口,-s参数可指定 subset(如clrlibrariesmono)。更细致的构建、调试与测试工作流可参考:

  • docs/workflow/using-docker.md:Docker 工作流完整说明;
  • docs/workflow/building/:coreclr、libraries、mono 等各 subset 的专项构建文档;
  • docs/workflow/debugging/:构建产物的调试指南;
  • eng/common/native/install-dependencies.sh:依赖安装脚本源码,可直接阅读确认各发行版的精确包列表。

总结:无论选择“自建环境”还是“Docker 镜像”,关键都在于满足三条硬性要求——CMake ≥ 3.26、WASM 场景下 Clang ≥ 16、交叉构建场景下准备好 binfmt/debootstrap/qemu 与对应的 crossrootfs。对照本文的包清单逐项核对,即可快速获得一个可用的 dotnet/runtime 构建环境。

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

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

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

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

立即咨询