开发工具构建工具【免费下载链接】cross“Zero setup” cross compilation and “cross testing” of Rust crates项目地址https://gitcode.com/gh_mirrors/cr/cross点击查看免费下载本文基于 cross 仓库的官方配置文档 docs/config_file.md 展开系统讲解Cross.toml配置文件中build与target.TARGET两大表的全部键位build-std、pre-build、dockerfile、zig、image、env等的写法与语义并结合 src/cross_toml.rs、src/config.rs 等源码解析配置的加载、合并与优先级裁决机制。读完后你可以独立完成为任意 Rust 项目编写跨编译配置文件、按目标定制 Docker 镜像、通过zig cc或build-std打通复杂交叉编译链路。配置文件放在哪里三种来源与优先级cross 支持三种等价程度不同的配置来源在 Cargo 项目根目录放置Cross.toml文件源码中实际解析的位置是 Cargoworkspace 根目录见下文设置CROSS_CONFIG环境变量指向任意位置的配置文件在Cargo.toml中写[package.metadata.cross.KEY]例如[package.metadata.cross.build]表与Cross.toml中的[build]表完全相同。官方文档给出的优先级规则是环境变量覆盖Cross.toml选项Cross.toml又覆盖Cargo.toml选项。从源码看配置的加载入口是 src/lib.rs 中的toml()函数检查顺序为若设置了CROSS_CONFIG从该环境变量指定的路径读取否则读取 workspace 根目录下的Cross.toml无论前两步是否命中都会继续读取Cargo.toml中的 workspace 元数据[workspace.metadata.cross]以及各 workspace 成员包的[package.metadata.cross]并通过CrossToml::mergesrc/cross_toml.rs与文件配置做字段级深度合并。若 workspace 与多个成员包同时定义了 cross 配置源码会提示Found conflicting cross configuration ... use[workspace.metadata.cross]并只使用其中一处。两个源码级细节值得注意文件名大小写敏感如果项目里放的是小写cross.tomlcross 会明确警告 Theres a file named cross.toml, instead of Cross.toml且该文件不会被加载配置中存在未识别的键时parse_from_deserializer会通过serde_ignored收集并输出 found unused key(s) in Cross configuration 警告src/cross_toml.rs这是排查拼写错误的第一线索。配置项与环境变量的等价关系Cross.toml中的每个配置项都可以用环境变量替代命名规则为CROSS_前缀加上大写化的作用域与键名-替换为_规则实现在 src/config.rs 的build_var_name配置项等价环境变量[build] dockerfile fooCROSS_BUILD_DOCKERFILEfoo[target.aarch64-unknown-linux-gnu] dockerfile fooCROSS_TARGET_AARCH64_UNKNOWN_LINUX_GNU_DOCKERFILEfoo[build.env] passthrough [...]CROSS_BUILD_ENV_PASSTHROUGH空格分隔列表例如文档示例CROSS_TARGET_AARCH64_UNKNOWN_LINUX_GNU_DOCKERFILEfoo就等价于target.aarch64-unknown-linux-gnu.dockerfile foo。完整的容器与行为类环境变量CROSS_CONTAINER_ENGINE、CROSS_BUILD_OPTS等见 docs/environment_variables.md。build全局构建配置build表设置对所有目标生效的全局变量完整示例如下继承自官方文档注释已补全[build] build-std false # 不重新编译 std 库 zig false # 不使用 zig cc 作为 C 交叉编译器 default-target x86_64-unknown-linux-gnu # 未显式指定 --target 时的默认目标 pre-build [ # 构建前在容器内执行的额外命令 dpkg --add-architecture $CROSS_DEB_ARCH, apt-get update apt-get --assume-yes install libssl-dev:$CROSS_DEB_ARCH ]对应结构体CrossBuildConfigsrc/cross_toml.rs中各字段的取值形态build-std可以是布尔值也可以是 crate 列表如[core, alloc]。源码中BuildStd是一个 untagged 枚举Bool(bool)/Crates(VecString)src/cross_toml.rs列表形式表示只从源码构建std中的部分 cratedefault-target当命令行与CARGO_BUILD_TARGET都未指定目标时生效。Config::target的取值顺序是CROSS_BUILD_TARGET→CARGO_BUILD_TARGET→default-targetsrc/config.rszig见下文 build.zig 一节pre-build见下文说明dockerfile见下文 build.dockerfile 一节。其中$CROSS_DEB_ARCH是 cross 自动注入的 build-arg当目标能映射到 Debian 架构名时构建自定义镜像会自动附加--build-arg CROSS_DEB_ARCH{arch}src/docker/custom.rs因此在pre-build命令和自定义 Dockerfile 中都可以直接引用它来安装目标架构的包。pre-build构建前的脚本或命令pre-build支持两种形态PreBuild枚举src/docker/custom.rs形态一指向一个脚本文件。文件路径相对于容器上下文即 workspace 根目录若使用了--manifest-path则为当前目录cross 会将其复制进容器并执行。官方文档给出的执行方式是RUN ./pre-build-script $CROSS_TARGET其中$CROSS_TARGET为目标三元组。示例[target.aarch64-unknown-linux-gnu] pre-build ./scripts/my-script.sh$ cat ./scripts/my-script.sh #!/usr/bin/env bash apt-get install libssl-dev -y对于更复杂的逻辑文档建议改用target.TARGET.dockerfile直接控制构建过程。形态二命令列表逐条在镜像内执行[target.aarch64-unknown-linux-gnu] pre-build [ dpkg --add-architecture $CROSS_DEB_ARCH, apt-get update, apt-get install --assume-yes libfoo:$CROSS_DEB_ARCH ]源码层面pre-build由opt_string_or_string_vec反序列化器处理src/cross_toml.rs字符串解析为PreBuild::Single数组解析为PreBuild::Lines。当配置来自环境变量时单行会被标记env: truesrc/config.rs多行按\n切分。build.zig用zig cc作为交叉 C 编译器build.zig让你使用zig cc完成 C/C 交叉编译从而用一个 Docker 镜像覆盖多种架构与 glibc 版本。注意文档提示zig cc并不支持全部目标仅覆盖 Linux GNU 目标的一个子集因此按目标启用target.TARGET.zig往往更合适。该键接受字符串、布尔或表三种写法CrossZigConfig同时实现了FromStr与Fromboolsrc/cross_toml.rs# 字符串等价于 zig.version 2.17 且 zig.enable true [build] zig 2.17 # 布尔等价于 zig.enable true [build] zig true# 表形式完整形态 [build.zig] enable true # 启用或禁用 zig cc version 2.17 # 使用的 glibc 版本 image myimage # 自定义包含 zig 的镜像启用 zig 后默认镜像名会切换为ghcr.io/cross-rs/zig:version系列image字段也可以写成nametoolchain的表形式与下文target.TARGET.image相同。build.env卷挂载与环境变量透传build.env全局设置挂载进容器的卷volumes以及需要透传进构建环境的环境变量[build.env] volumes [VOL1_ARG, VOL2_ARG/path/to/volume] passthrough [VAR1_ARG, VAR2_ARGVALUE]注意两种条目的语义差异官方文档原文语义passthrough中VAR1_ARG取宿主机上该环境变量的当前值而写成VAR2_ARGVALUE则固定透传VALUEvolumes中VOL1_ARG表示以宿主机上该环境变量的值作为卷路径VOL2_ARG/path/to/volume则直接使用字面路径/path/to/volume。源码上volumes与passthrough的解析都归入CrossEnvConfigsrc/cross_toml.rs。二者在合并策略上有一个微妙差异passthrough会累加环境变量中的 buildtarget 列表相加无环境变量时 TOML 中 buildtarget 两层的列表相加见Config::env_passthrough的sum truesrc/config.rs而volumes按四级优先级择一见文末。src/config.rs的测试模块如toml_build_passthrough_then_use_target_passthrough_both、toml_target_passthroughsrc/config.rs逐条验证了这些行为。build.dockerfile全局自定义镜像如果目标镜像在镜像仓库中已经存在优先使用下文target.TARGET.image。build.dockerfile为除单独指定了target.TARGET.dockerfile的目标之外的所有目标提供自定义 Docker 镜像。取值可以是字符串或表字符串等价于build.dockerfile.file[build] dockerfile ./Dockerfile[build.dockerfile] file ./Dockerfile # Dockerfile 路径相对于 Cargo.toml context . # 构建上下文目录默认为 . build-args { ARG1 foo } # 透传给 docker build 的 --build-arg使用自定义镜像时官方文档建议基于 cross 对应目标的默认镜像ghcr.io/cross-rs/{{TARGET}}:{{VERSION}}{{VERSION}}为 cross 的版本来派生这样无需自行解决交叉 C 工具链的安装问题FROM ghcr.io/cross-rs/aarch64-unknown-linux-gnu:latest RUN dpkg --add-architecture $CROSS_DEB_ARCH \ apt-get update \ apt-get install --assume-yes libfoo:$CROSS_DEB_ARCHcross 在构建这类 Dockerfile 时会自动注入CROSS_BASE_IMAGEbuild-arg指向否则将要使用的默认镜像因此可以写成更通用的形式注入逻辑在 src/docker/custom.rsARG CROSS_BASE_IMAGE FROM $CROSS_BASE_IMAGE RUN ...几个源码级补充构建命令的组装在Dockerfile::buildsrc/docker/custom.rs依次追加--platform非本机平台时、CROSS_LABEL_DOMAIN.workspace_root标签、--build-arg含$CROSS_DEB_ARCH、--output typedocker最后以context未配置时默认为宿主 workspace 根作为构建上下文执行docker build由pre-build自动派生或用户提供的自定义镜像命名格式为localhost/cross-rs/cross-custom-包名:目标-路径哈希pre-build派生版本额外带-pre-build后缀CROSS_CUSTOM_DOCKERFILE_IMAGE_PREFIX与Dockerfile::image_namesrc/docker/custom.rsbuild-args是唯一不支持环境变量覆盖的 dockerfile 子项Config::dockerfile_build_args直接从 TOML 取值src/config.rs。target.TARGET按目标定制target表对特定编译目标覆盖全局设置官方文档给出的示例覆盖了三个常用键[target.aarch64-unknown-linux-gnu] build-std [core, alloc] # 总是从源码构建 std 库的 core 和 alloc image test-image # 为该目标使用不同镜像 runner qemu-user # 运行二进制的包装器取值须为 qemu-system、qemu-user 或 nativetarget.TARGET.pre-build与全局build.pre-build完全相同脚本文件或命令列表两种形态但只对该目标生效。当目标级与全局级同时定义时解析优先级为目标级 全局级见文末四级优先级。target.TARGET.image为某个目标指定自定义镜像[target.aarch64-unknown-linux-gnu] image my/image:latest此时 cross 不再使用默认镜像拉取行为遵循标准 Docker 语义官方文档原文规则先查找本地镜像my/image:latest本地不存在则去 Docker Hub 拉取若只写image:latest无 registry/镜像名前缀Docker不会去 Docker Hub 查找省略 tag 时 Docker 默认使用latest。更有意思的是image还接受三种半限定字符串写法解析规则由ImageReference枚举决定src/docker/image.rs以:或开头视为纯 tag/digestIdentifier以-开头视为 subtarget 后缀Subtarget其余视为完整镜像名Name。ensure_qualifiedsrc/docker/image.rs负责补全前缀[target.aarch64-unknown-linux-gnu] # 翻译为 ghcr.io/cross-rs/aarch64-unknown-linux-gnu:edge image :edge [target.x86_64-unknown-linux-musl] # 翻译为 ghcr.io/cross-rs/x86_64-unknown-linux-muslsha256:77db671d8356a64ae72a3e1415e63f547f26d374fbe3c4762c1cd36c7eac7b99 image sha256:77db671d8356a64ae72a3e1415e63f547f26d374fbe3c4762c1cd36c7eac7b99subtarget 形式用于选择同一目标的变体镜像如 CentOS 基础镜像[target.x86_64-unknown-linux-gnu] # 翻译为 ghcr.io/cross-rs/x86_64-unknown-linux-gnu:0.3.0-centos image -centos即ghcr.io/cross-rs/目标:默认版本后缀其中默认版本由DEFAULT_IMAGE_VERSION常量给出src/docker/shared.rs取自构建时的 commit 信息。image键还可以展开为nametoolchain表用于声明镜像支持哪些工具链平台[target.aarch64-unknown-linux-gnu] image.name alpine:edge image.toolchain [x86_64-unknown-linux-musl, linux/arm64aarch64-unknown-linux-musl] # 默认 x86_64-unknown-linux-gnutoolchain列表中的每一项按ImagePlatform解析src/docker/image.rs接受两种格式直接的目标三元组如x86_64-unknown-linux-musl或 Docker 平台串加等号映射os/arch[/variant]toolchain如linux/arm64aarch64-unknown-linux-musl。当toolchain为空时默认平台是x86_64-unknown-linux-gnuImagePlatform::DEFAULT当列出多个平台时PossibleImage::to_definite_withsrc/docker/image.rs会优先挑选与本机容器引擎架构一致的平台无法确定时退回第一个候选并给出警告。一个容易踩的坑某些目标如x86_64-unknown-linux-gnu在 cross 中同时存在多个官方镜像默认版与-centos等 subtarget 变体。get_image的裁决逻辑src/docker/shared.rs是只有一个候选直接用多个候选但只有一个非 subtarget 的用那个否则报错并提示 specify toolchain inCross.toml。此时就应使用上面的image.nameimage.toolchain表来显式消歧。target.TARGET.env与build.env同构但只作用于指定目标[target.x86_64-unknown-linux-gnu.env] volumes [VOL1_ARG, VOL2_ARG/path/to/volume] passthrough [VAR1_ARG, VAR2_ARGVALUE]target.TARGET.dockerfile为单个目标提供自定义镜像取值形态与build.dockerfile相同字符串等价于.file[target.aarch64-unknown-linux-gnu] dockerfile ./Dockerfile[target.aarch64-unknown-linux-gnu.dockerfile] file ./Dockerfile # Dockerfile 路径相对于 Cargo.toml context . # 构建上下文目录默认为 . build-args { ARG1 foo } # 透传的 --build-arg解析时 target 级的file/context优先于 build 级CrossToml::dockerfile与dockerfile_context都返回ConfVal { build, target }src/cross_toml.rs而build-args是两者合并取并集opt_mergesrc/config.rs。src/config.rs中env_target_then_toml_target_then_env_build_then_toml_build测试src/config.rs精确验证了四级裁决顺序。target.TARGET.zig与build.zig相同但按目标生效字符串/布尔/表三种写法# 字符串等价于 version 2.17 且 enable true [target.aarch64-unknown-linux-gnu] zig 2.17 # 布尔等价于 enable true [target.aarch64-unknown-linux-gnu] zig true[target.aarch64-unknown-linux-gnu.zig] enable true # 启用或禁用 zig cc version 2.17 # 使用的 glibc 版本 image myimage # 自定义包含 zig 的镜像值解析优先级与调试要点当同一个键同时出现在多个来源时Config::get_from_value_innersrc/config.rs按固定顺序裁决对绝大多数标量配置项生效CROSS_TARGET_TRIPLE_KEY目标级环境变量target.TARGET.KEY目标级 TOMLCROSS_BUILD_KEY构建级环境变量build.KEY构建级 TOML叠加跨文件规则环境变量整体高于Cross.tomlCross.toml高于Cargo.toml元数据以及passthrough的累加特例就构成了完整的配置解析模型。配合三个调试手段可以快速定位配置不生效的原因unused key 警告写错键名时解析器会列出全部未识别键src/cross_toml.rs目标拼写检查Config::confusable_targetsrc/config.rs会检测配置文件里差一个下划线/大小写的目标名并警告 Is the target misspelled in the Cross configuration?单元测试基线解析与合并行为有充分测试覆盖——src/cross_toml.rs的parse_build_toml、parse_target_toml、parse_mixed_toml、merge等用例src/cross_toml.rs以及src/tests/toml.rs中的往返roundtrip测试都可以作为某段配置应被解析成什么的参照。最后提醒以上所有配置项均可通过环境变量替代完整的环境变量清单包括容器引擎、UID/GID、远程构建等请查阅 docs/environment_variables.md自定义镜像的更多实践见 docs/custom_images.md。赞分享开发工具构建工具【免费下载链接】cross“Zero setup” cross compilation and “cross testing” of Rust crates项目地址https://gitcode.com/gh_mirrors/cr/cross点击查看免费下载相关推荐cross 配置全解Cross.toml、环境变量与 CARGO_TARGET_* 交叉编译参数cross 配置全解Cross.toml、环境变量与 CARGO_TARGET_ 交叉编译参数 本文围绕 docs/cargo_configuration.m开发工具构建工具Flysystem配置系统详解环境变量与动态配置Flysystem配置系统详解环境变量与动态配置 在现代应用开发中文件系统操作的灵活性和可配置性直接影响系统的可维护性和扩展性。Flysystem作为文件系后端Cargo 配置系统完全指南config.toml 层级结构、环境变量与所有配置键详解Cargo 配置系统完全指南config.toml 层级结构、环境变量与所有配置键详解 本文系统讲解 CargoThe Rust package manag开发工具包管理器CLI构建工具上一篇Canvas动画库性能监控终极指南实时追踪动画效果的10个技巧下一篇Tile38数据加密方案字段级与传输加密实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
三菱FX5U以太网通信上位机开发:MC协议报文解析与WinForm实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:14:37
Wireshark抓USB包实战:URB分析与设备调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:14:37
STM32 I2C CubeMX配置四大致命陷阱与信号完整性避坑指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:58:52
树莓派4B变身AI牛马:8GB内存跑本地大模型的实践与避坑指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:58:51
OpenClaw驱动SolidWorks二次开发:自然语言建模与自动化导出实战 最近我把 OpenClaw 这个本地 AI Agent 框架和 SolidWorks 的二次开发链路打通了,现在能做到用自然语言直接驱动一部分建模、改参和导出操作。这套组合的定位不是拿 AI 替代 CAD 软件,而是让 AI 当“一个能听懂人话的调度员”,把重复的 API 调… · 2026/9/25 4:58:51
从 Codex CLI 到知识库:TaoToken 统一 Key 驱动的 AI 代理个人知识管理全流程 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:58:44
Python寒假作业实战指南:从环境搭建到代码调试全流程 拿到“Python第一次作业(寒假)”这个标题,我第一反应是想起自己当年第一次提交Python作业的样子——表面上是写几段代码,实际上一大半时间都耗在装环境、调报错、纠结“为什么输出和我想要的不一样”上面。这篇文章就是给同样在寒… · 2026/9/25 4:58:44
把显示器插到核显上:5090 单卡跑 Qwen 27B 262K 上下文的显存优化实战 1. 这个标题到底在说什么:先拆解核心逻辑第一次看到“把显示器插到核显上——5090 跑本地 Qwen 3.8 27B,上下文拉满 262K”这个标题,很多人第一反应是:显示器插哪儿跟跑模型有什么关系?这不是玄学吗?我一开… · 2026/9/25 4:58:38
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37