Rust wasm32-unknown-unknown数学函数没有链接

Ice*_*erg 3 rust webassembly

我正在为Rust尝试新的wasm32-unknown-unknown目标,并且我遇到了调用数学函数的问题(例如sin,cos,exp,atan2).

Cargo.toml:

[package]
name = "wasm_math"
version = "0.1.0"
authors = ["..."]

[lib]
path = "src/lib.rs"
crate-type = ["cdylib"]

[dependencies]
Run Code Online (Sandbox Code Playgroud)

SRC/lib.rs:

#[no_mangle]
pub extern "C" fn invoke_sin(x: f64) -> f64 {
    x.sin()
}
Run Code Online (Sandbox Code Playgroud)

index.html的:

<!doctype html>
<html lang="en">
  <head><meta charset="utf-8"><title>Wasm Math</title></head>
  <body></body>
  <script>
    const imports = { env: { } };
    fetch("target/wasm32-unknown-unknown/release/wasm_math.wasm").then(response =>
      response.arrayBuffer()
    ).then(bytes =>
      WebAssembly.instantiate(bytes, imports)
    ).then(results => {
      alert(results.instance.exports.invoke_sin(1.0));
    });
  </script>
</html>
Run Code Online (Sandbox Code Playgroud)

我用命令构建项目

cargo build --release --target wasm32-unknown-unknown
Run Code Online (Sandbox Code Playgroud)

当我在firefox中打开html文件时,出现以下错误:

LinkError: import object field 'sin' is not a Function
Run Code Online (Sandbox Code Playgroud)

我的设置有问题吗?或者这是Rust/WebAssembly/Firefox中的缺点?我可以手动将sin函数添加到imports.envjavascript中的对象,但这似乎非常hacky我必须为我使用的每个数学函数执行此操作.有没有更好的办法?

我正在使用每晚Rust工具链(nightly-x86_64-unknown-linux-gnu rustc 1.24.0-nightly(cddc4a62d 2017-12-26))和Firefox 57.0.1(64位).

Kyl*_*yle 5

根据WASM FAQ sin不包括在内.

•WebAssembly不包含自己的数学函数,如sin,cos,exp,pow等.WebAssembly对这些函数的策略是允许它们在WebAssembly本身中实现为库例程(注意x86的sin和cos指令是缓慢且不精确的,并且这些天通常都会被避免).希望在WebAssembly上使用更快和更精确的数学函数的用户可以简单地选择这样做的数学库实现.

Rust似乎依赖于LLVM提供sin(这里是f64 impl),它不为WASM做.我认为LLVM 应该将它作为其llvm.sin.f64内在的一部分提供,但似乎它们不能保证每个目标的实现每个https://llvm.org/docs/LangRef.html#llvm-sin-intrinsic(强调我的) :

这是一个过载的内在.您可以在任何浮点或浮点类型的向量上使用llvm.sin.但并非所有目标都支持所有类型.

也许,鉴于此,Rust应该考虑实现sin自己.