首页 > 解决方案 > link-arg 没有将编译器选项传递给 rustc

问题描述

我正在从 Rust 文件生成 asm.js,如下所示:

rustc demo.rs --target asmjs-unknown-emscripten -C opt-level=0 -C link-arg="-s MINIMAL_RUNTIME=1" -C link-arg="-s ENVIRONMENT=web" -C link-arg="-s LEGACY_VM_SUPPORT=1" -o ../../build/bytecode/demo.asm.js

然而,当我查看生成的 asm.js 文件时,我可以清楚地看到那些编译器选项没有通过 - 代码仍然假设它可以在任何环境中运行,并且缺少旧的 VM polyfills。

我错过了什么?

这是 rust 文件,以防万一:

#[allow(dead_code)]
pub fn my_add(num1: f64, num2: f64) -> f64 {
    return num1 + num2;
}

pub fn main() {
    println!("Rust loaded");
}

标签: rustasm.js

解决方案


我有两个建议。

如果我们查看文档,可以link-arg选择传递单个参数和link-args传递多个参数。因为link-args存在,并且文档指定参数必须用空格分隔,所以也许您应该使用... link-args="-s MINIMAL_RUNTIME=1",甚至... -C link-arg="-s" -C link-arg="MINIMAL_RUNTIME=1" ...还没有尝试过。

其次,根据这篇文章,似乎有将参数传递给特定编译器的链接器的旧方法。emcc您可以通过在项目文件夹中创建一个名为的文件来围绕编译器创建一个包装器,该文件emcc_sdl包含:

emcc "-s" "MINIMAL_RUNTIME=1" "-s" "ENVIRONMENT=web" "-s" "LEGACY_VM_SUPPORT=1" $@

使其可执行:

> chmod +x emcc_sdl

创建或编辑.cargo/config文件并添加:

[target.wasm32-unknown-emscripten]
linker = "/project_dir/project_name/emcc_sdl"

[target.asmjs-unknown-emscripten]
linker = "/project_dir/project_name/emcc_sdl"

您应该能够使用以下方式构建:

rustc demo.rs --target asmjs-unknown-emscripten -C opt-level=0 -o ../../build/bytecode/demo.asm.js

希望能帮助到你。


推荐阅读