【问题标题】:link-arg not passing compiler options to rustclink-arg 没有将编译器选项传递给 rustc
【发布时间】:2020-06-27 13:08:40
【问题描述】:

我正在从 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 polyfill。

我错过了什么?

这是 rust 文件,以防万一:

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

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

【问题讨论】:

标签: rust asm.js


【解决方案1】:

我有两个建议。

如果我们查看documentationlink-arg 选项可以传递单个参数,link-args 可以传递多个参数。因为link-args存在,而且文档规定参数必须用空格隔开,也许你应该用... link-args="-s MINIMAL_RUNTIME=1",甚至... -C link-arg="-s" -C link-arg="MINIMAL_RUNTIME=1" ...还没试过。

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

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

希望对你有帮助。

【讨论】:

  • --target asmjs-unknown-emscripten 以 emscripten 编译器为目标,它可以识别这些标志。
  • 知道了。我用两种可能的解决方案更新了我的答案
猜你喜欢
  • 2021-10-10
  • 2013-12-01
  • 2015-09-26
  • 1970-01-01
  • 2023-04-08
  • 2017-11-01
  • 1970-01-01
相关资源
最近更新 更多