使用Bazel结合rules_rust构建Android rust_binary失败求助
解决rules_rust构建Android rust_binary的问题
问题根源
你遇到的错误是因为Bazel尝试用**主机架构(darwin_arm64,即M系列Mac)**去匹配Android NDK的工具链,但NDK工具链是针对Android目标架构的,没有对应主机架构的版本。核心问题是构建命令未明确指定Android目标对应的工具链,且rules_rust可能缺少交叉编译配置。
解决步骤
1. 完善WORKSPACE配置
确保已正确引入rules_rust、rules_android和Android NDK:
配置rules_android与NDK
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") # 引入rules_android http_archive( name = "rules_android", urls = ["https://github.com/bazelbuild/rules_android/archive/refs/tags/v0.1.1.tar.gz"], sha256 = "6e6e7cff30362d58b2312d306cd8d648c5546e152f917e077744904f778f619d", ) load("@rules_android//android:repositories.bzl", "android_repositories") android_repositories() # 配置Android NDK android_ndk_repository( name = "androidndk", api_level = 30, # 匹配你的Android最低版本要求 )
配置rules_rust交叉编译工具链
# 引入rules_rust http_archive( name = "rules_rust", sha256 = "c1b00f65f54a4c487d1fcb635e3d7d2a4c6f9b4e48380b30d2f3c7c0a3f9f39d", urls = ["https://github.com/bazelbuild/rules_rust/releases/download/0.35.0/rules_rust-v0.35.0.tar.gz"], ) load("@rules_rust//rust:repositories.bzl", "rust_repositories", "rust_toolchain") # 下载rust预编译工具链 rust_repositories( version = "1.75.0", # 选择兼容NDK的rust版本 ) # 配置Android ARM64的rust工具链 rust_toolchain( name = "rust_android_arm64", target_triple = "aarch64-linux-android", rustc = "@rust_toolchains//:aarch64-linux-android/rustc", cargo = "@rust_toolchains//:aarch64-linux-android/cargo", rust_lib = "@rust_toolchains//:aarch64-linux-android/rust_lib", toolchain = "@androidndk//:toolchains/llvm/prebuilt/darwin-x86_64:aarch64-linux-android", )
2. 调整BUILD文件(可选)
你的现有BUILD文件无需修改,若需指定默认目标平台,可添加:
rust_binary( name = "hello", srcs = ["src/main.rs"], # 可选:默认指定Android ARM64平台 # platform = "@rules_rust//rust/platforms:aarch64-linux-android", )
3. 正确执行构建命令
运行以下命令,明确指定目标平台和对应工具链:
bazel build //rust:hello \ --platforms=@rules_rust//rust/platforms:aarch64-linux-android \ --extra_toolchains=//:rust_android_arm64 \ --host_platform=@bazel_tools//platforms:host
或者直接指定NDK的目标工具链(无需自定义rust_toolchain时):
bazel build //rust:hello \ --platforms=@rules_rust//rust/platforms:aarch64-linux-android \ --extra_toolchains=@androidndk//:toolchains/llvm/prebuilt/darwin-x86_64:aarch64-linux-android \ --host_platform=@bazel_tools//platforms:host
关键说明
- target_triple:Android ARM64对应的rust目标三元组是
aarch64-linux-android,其他架构可对应调整(如ARM32是armv7-linux-androideabi)。 - NDK路径:
@androidndk//:toolchains/llvm/prebuilt/darwin-x86_64会自动适配你的Mac架构,Intel和M系列Mac均兼容。 - 版本兼容:建议使用rust 1.60+搭配NDK 25+,避免版本不匹配导致的编译问题。
内容的提问来源于stack exchange,提问作者geaden
相关产品推荐
相关产品推荐

