如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这段话即可:
请先阅读并遵守:https://xuanyuan.cloud/agents.md
未读文档前不要生成 pull 命令或排错方案。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
🚀 Help me to become a full-time open-source developer by https://github.com/***/messense
Compile Cargo project with https://github.com/ziglang/zig as linker for easier cross compiling.
bashcargo install --locked cargo-zigbuild
You can also install it using pip which will also install https://pypi.org/project/ziglang/ automatically:
bashpip install cargo-zigbuild
We also provide Docker images which has macOS SDK pre-installed in addition to cargo-zigbuild and Rust, for example to build for x86_64 macOS:
bashdocker run --rm -it -v $(pwd):/io -w /io ghcr.io/rust-cross/cargo-zigbuild \ cargo zigbuild --release --target x86_64-apple-darwin
pip3 install ziglangrustup target add aarch64-unknown-linux-gnucargo zigbuild, for example, cargo zigbuild --target aarch64-unknown-linux-gnu| Variable | Description |
|---|---|
CARGO_ZIGBUILD_PYTHON_PATH | Python executable path when using Python ziglang package (default: python3) |
CARGO_ZIGBUILD_ZIG_PATH | Zig executable path (default: zig) |
CARGO_ZIGBUILD_CACHE_DIR | Cache directory for zig tools and wrappers |
CARGO_ZIGBUILD_RUSTC_VERSION | Override detected rustc version |
CARGO_ZIGBUILD_TARGET | Resolved zig target triple exported to build scripts, for example x86_64-linux-gnu.2.36 (also CARGO_ZIGBUILD_TARGET_<target>, which is always set; the unsuffixed name only when a single --target is given) |
SDKROOT | Path to macOS SDK (auto-detected on macOS) |
CMAKE_TOOLCHAIN_FILE | Path to CMake toolchain file (also CMAKE_TOOLCHAIN_FILE_<target>, TARGET_CMAKE_TOOLCHAIN_FILE) |
BINDGEN_EXTRA_CLANG_ARGS | Extra clang arguments for bindgen (also BINDGEN_EXTRA_CLANG_ARGS_<target>) |
PKG_CONFIG_SYSROOT_DIR | System root for pkg-config (auto-set to SDKROOT for Apple targets) |
OHOS_NDK_HOME | Path to OpenHarmony NDK (required for ohos targets) |
CFLAGS | Additional C compiler flags |
RUSTFLAGS | Additional Rust compiler flags |
By default --target for *-gnu will have Zig implicitly build for a default version of glibc that varies based on the release of Zig (https://github.com/ziglang/zig/blob/0.14.1/lib/std/Target.zig#L473).
To build for a specific minimum glibc version, add that version as a suffix to the --target value. For example, to compile with --target aarch64-unknown-linux-gnu for glibc 2.17:
bashcargo zigbuild --target aarch64-unknown-linux-gnu.2.17
[!NOTE] There are https://github.com/rust-cross/cargo-zigbuild/issues/231#issuecomment-*** with the glibc version targeting feature:
- If you do not provide a
--target, Zig is not used and the command effectively runs a regularcargo build.- If you specify an invalid glibc version,
cargo zigbuildwill not relay the warning emitted fromzig ccabout the fallback version selected.- This feature does not necessarily match the behaviour of dynamically linking to a specific version of glibc on the build host.
- Version 2.32 can be specified, but runs on a host with only 2.31 available when it should instead abort with an error.
- Meanwhile specifying 2.33 will correctly be detected as incompatible when run on a host with glibc 2.31.
- Certain
RUSTFLAGSlike-C linkeropt-out of using Zig, while-L path/to/fileswill have Zig ignore-C target-feature=+crt-static.-C target-feature=+crt-staticfor statically linking to a glibc version is not supported (upstreamzig cclacks support). Use a*-musltarget instead if you need a fully static binary.
Tip - cargo zigbuild cannot find headers (*.h files) or libraries that exist
You may need to prepend the following ENV to your cargo zigbuild command with the following system paths or similar:
CFLAGS='-isystem /usr/include'RUSTFLAGS='-L /usr/lib64'cargo zigbuild always uses the zig cc option -nostdinc which excludes standard header locations like /usr/include. This is also a default behaviour for Zig whenever it is configured with a --target, which additionally opts out of standard system search paths.
This can lead to a common difference between cargo build being successful, while cargo zigbuild fails without extra configuration:
console# Cannot find a header file to build: fatal error: 'libelf.h' file not found # Cannot find a shared library to link: error: unable to find dynamic system library 'elf' using strategy 'no_fallback'. searched paths
There is a variety of ways to resolve this, but for system paths like /usr/include you must be careful to avoid getting the system glibc headers mixed with the glibc headers Zig provides itself, otherwise this will produce errors like from CPATH=/usr/include:
rustIn file included from /usr/local/lib64/python3.13/site-packages/ziglang/lib/libunwind/src/gcc_personality_v0.c:21: In file included from /usr/local/lib64/python3.13/site-packages/ziglang/lib/libunwind/include/unwind.h:18: In file included from /usr/include/stdint.h:26: In file included from /usr/include/bits/libc-header-start.h:33: /usr/include/features.h:516:9: warning: '__GLIBC_MINOR__' macro redefined [-Wmacro-redefined] 516 | #define __GLIBC_MINOR__ 41 | ^ <command line>:2:9: note: previous definition is here 2 | #define __GLIBC_MINOR__ 37 |
When you have installed system packages that added headers to /usr/include that your project needs to build, you will want Zig to fallback to /usr/include just for those headers while using it's own for glibc. This can be done with zig cc -isystem /usr/include, which for cargo zigbuild can be configured through the common ENV CFLAGS='-isystem /usr/include'.
For the similar issue with shared libraries, if your packages are installing system libraries at /usr/lib64 you would normally use LDFLAGS='-L /usr/lib64', but rustc and cargo do not read this ENV but they must be configured with the search path for crates with a build.rs that searches for a library to link dynamically/statically. Instead you will need to use RUSTFLAGS='-L /usr/lib64'.
Tip - Verify minimum GLIBC version required
Provided you have no stripped the symbols from your binary built, on Linux you can run the following script to scan for glibc versioned symbols and find the highest version (the minimum required to run)
Create a file /usr/local/bin/get-min-glibc:
bash#!/bin/bash FILE_NAME=$1 LANG=C readelf -W --version-info --dyn-syms ${FILE_NAME} \ | grep 'Name: GLIBC' \ | sed -re 's/.*GLIBC_(.+) Flags.*/\1/g' \ | sort -t . -k1,1n -k2,2n \ | tail -n 1
Make the script command executable:
bashchmod +x /usr/local/bin/get-min-glibc
Run the command with the path to your executable / library to check:
console$ get-min-glibc target/x86_64-unknown-linux-gnu/release/hello-world 2.28
When cross-compiling for a CPU newer than the target's baseline — for example AWS Graviton (ARM Neoverse) instances — specify the target CPU via RUSTFLAGS, or you may hit hard-to-diagnose Illegal instruction (SIGILL, exit code 132) errors at runtime, or leave performance on the table:
bashRUSTFLAGS='-C target-cpu=neoverse-n1' cargo zigbuild --release --target aarch64-unknown-linux-gnu.2.34
cargo zigbuild picks up -C target-cpu and passes a matching -mcpu to zig cc so that C/C++ dependencies are built for the same CPU.
Since environment variables can't be set in cargo aliases, you can also pass the rustflags via cargo's --config option — cargo zigbuild honors it the same way:
bashcargo zigbuild --release --target x86_64-unknown-linux-gnu \ --config "target.x86_64-unknown-linux-gnu.rustflags=['-C', 'target-cpu=x86-64-v4']"
This makes it possible to scope a target-cpu to a specific alias in .cargo/config.toml instead of applying it to every build for that target:
toml[alias] build-prod = "zigbuild --release --target x86_64-unknown-linux-gnu --config target.x86_64-unknown-linux-gnu.rustflags=['-C','target-cpu=x86-64-v4']"
Conversely, if a binary built for x86_64-unknown-linux-gnu dies with Illegal instruction on older hardware, check whether your RUSTFLAGS/.cargo/config.toml sets a target-cpu newer than the machines you deploy to.
cargo zigbuild supports a special universal2-apple-darwin target for building macOS universal2 binaries/libraries on Rust 1.64.0 and later.
bashrustup target add x86_64-apple-darwin rustup target add aarch64-apple-darwin cargo zigbuild --target universal2-apple-darwin
Note
Note that Cargo
--message-formatoption doesn't work with universal2 target currently.
Known upstream zig https://github.com/ziglang/zig/labels/zig cc:
zig cc, for example armv7-unknown-linux-gnueabihf, workaround by using -mcpu=generic and
explicitly passing target features in https://github.com/rust-cross/cargo-zigbuild/pull/58SDKROOT environment variable to a macOS SDK path to workaround itThis work is released under the MIT license. A copy of the license is provided in the LICENSE file.
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务
以下是 messense/cargo-zigbuild 相关的常用 Docker 镜像,适用于 不同场景 等不同场景: