如何使用Bazel结合rules_rust构建依赖rust_library的Rust Wasm二进制文件?
使用Bazel + rules_rust构建依赖Rust库的Wasm二进制文件
1. 配置Wasm目标的Rust工具链
在WORKSPACE文件中,确保rules_rust已正确引入,然后注册Wasm专用工具链:
rust_toolchain( name = "rust_wasm32", target_triple = "wasm32-unknown-unknown", # 若需指定rustc或其他工具路径,可在此配置 )
可在.bazelrc中设置Wasm构建的默认参数,避免每次构建重复输入:
# .bazelrc 添加以下内容 build:wasm --copt=--target=wasm32-unknown-unknown build:wasm --rust_toolchain=@//:rust_wasm32
2. 定义依赖现有Rust库的Wasm二进制目标
在BUILD文件中,用rust_binary规则创建Wasm目标,直接依赖你已配置好的rust_library:
# 已定义好的Rust库示例 rust_library( name = "my_rust_lib", srcs = glob(["src/lib/**/*.rs"]), # 库的其他配置:依赖、特性开关等 ) # Wasm二进制目标 rust_binary( name = "my_wasm_bin", srcs = ["src/bin/main.rs"], deps = [":my_rust_lib"], # 指定Wasm目标三元组 target_triple = "wasm32-unknown-unknown", # 可选:根据场景添加编译参数,比如无_std环境、导出符号等 rustc_flags = [ "--no-default-features", "--features=wasm", # 给浏览器使用时,通常需要这两个链接参数 "-C", "link-arg=--export-all", "-C", "link-arg=--no-entry", ], )
3. 执行构建
用.bazelrc中定义的wasm配置执行构建:
bazel build //:my_wasm_bin --config=wasm
若不想修改.bazelrc,也可直接在命令行指定参数:
bazel build //:my_wasm_bin --copt=--target=wasm32-unknown-unknown
4. 常见问题解决
- Wasm工具链找不到:先检查本地Rust环境是否安装了Wasm目标,执行
rustup target add wasm32-unknown-unknown安装即可。 - 依赖的Rust库编译失败:排查库是否使用了仅支持原生平台的依赖,或是否有针对Wasm的特性开关,调整库的features或依赖项即可。
- 生成的Wasm无法在浏览器运行:若需与JS交互,可使用rules_rust提供的
rust_wasm_bindgen规则生成JS绑定:
load("@rules_rust//rust:wasm_bindgen.bzl", "rust_wasm_bindgen") rust_wasm_bindgen( name = "my_wasm_bindgen", dep = ":my_wasm_bin", # 可选:指定输出JS/TypeScript绑定文件 modes = ["js"], )
构建该目标会生成可直接在JS中调用的绑定文件。
内容的提问来源于stack exchange,提问作者akdom
相关产品推荐
相关产品推荐

