koute / cargo-web

A Cargo subcommand for the client-side Web

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

tests pass on asmjs but fail on wasm32-unknown

elichai opened this issue · comments

Hi,
Running cargo web test --target=asmjs-unknown-emscripten the tests pass smoothly.
But If I run cargo web test --target=wasm32-unknown-unknown I get the following:

Error loading Rust wasm module 'mylib_41e23712799ffb49': <LinkError>
error: unhandled exception thrown
error:     LinkError: WebAssembly.instantiate(): Import #0 module="env" function="a_c_function" error: function import requires a callable
    at WebAssembly.instantiate (http://localhost:41879/__cargo-web__/test_runner.js:319:36)
    at http://localhost:41879/js/app.js:37:65
error: source: http://localhost:41879/__cargo-web__/test_runner.js:318:35

The a_c_function is a C function provided that I use in rust.
why does it fail? how can I fix this?

commented

Based on that error message alone I'm unable to tell you why it happens. Can you perhaps post a minimal reproduction of your problem?

commented

Ah, right. It's natural that it doesn't work as AFAIK wasm32-unknown-unknown in general doesn't support linking with non-Rust code. (In theory it's possible, but you'd have to compile the C code manually, and then manually hook it up in your Rust module imports.)

By the way, this is unrelated to your issue, but it's interesting that your example doesn't compile on nightly (with vanilla cargo):

$ rustup run nightly rustc --version
rustc 1.38.0-nightly (4560cb830 2019-07-28)
$ rustup run nightly cargo rustc --target wasm32-unknown-unknown --profile test
error: linking with `rust-lld` failed: exit code: 1
  |
...snip...
  = note: rust-lld: error: /tmp/cargo-web-test/target/wasm32-unknown-unknown/debug/build/testweb-dfe6cd8f46074fe6/out/liblinkme.a: archive has no index; run ranlib to add one
          

error: aborting due to previous error

error: Could not compile `testweb`.

while it does on stable:

$ rustup run stable rustc --version
rustc 1.36.0 (a53f9df32 2019-07-03)
$ rustup run stable cargo rustc --target wasm32-unknown-unknown --profile test
    Finished dev [unoptimized + debuginfo] target(s) in 0.14s

It might be worthwhile to create a rustc issue for this. (:

This works with wasm-pack easily.
as long as you have clang there's no reason it won't compile the C code to wasm32-unknown-unknown