rust - Rust stdweb无法编译

标签 rust webassembly rust-cargo

我想开始使用stdweb库,但是由于某些原因我的代码无法编译。这是代码:

#[macro_use]
extern crate stdweb;

fn main() {
    stdweb::initialize();

    let message = "Hello, 世界!";
    js! {
        alert( @{message} );
    }

    stdweb::event_loop();
}

这是我运行cargo web start --target=wasm32-unknown-unknown时遇到的错误:
error: linking with `rust-lld` failed: exit code: 1
  |
  = note: "rust-lld" "rust-lld" "-flavor" "wasm" "--no-threads" "-z" "stack-size=1048576" "--stack-first" "--allow-undefined" "--fatal-warnings" "--no-demangle" "--export-dynamic" "--no-entry" "-L" "/home/kuba/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-unknown/lib" "/home/kuba/Projects/rust-snake/target/wasm32-unknown-unknown/debug/deps/rust_snake.16ntzdg2n8bx81q6.rcgu.o" "/home/kuba/Projects/rust-snake/target/wasm32-unknown-unknown/debug/deps/rust_snake.2xfx8uklq7n12q67.rcgu.o" "/home/kuba/Projects/rust-snake/target/wasm32-unknown-unknown/debug/deps/rust_snake.48klqndjiid3k9rj.rcgu.o" "/home/kuba/Projects/rust-snake/target/wasm32-unknown-unknown/debug/deps/rust_snake.48le17nhrmqft97k.rcgu.o" "/home/kuba/Projects/rust-snake/target/wasm32-unknown-unknown/debug/deps/rust_snake.4b580liojrglk551.rcgu.o" "/home/kuba/Projects/rust-snake/target/wasm32-unknown-unknown/debug/deps/rust_snake.4rrrlrglrmdphj5c.rcgu.o" "/home/kuba/Projects/rust-snake/target/wasm32-unknown-unknown/debug/deps/rust_snake.4vuc8rinrzvzrs2v.rcgu.o" "/home/kuba/Projects/rust-snake/target/wasm32-unknown-unknown/debug/deps/rust_snake.50srrlytlsid8m35.rcgu.o" "/home/kuba/Projects/rust-snake/target/wasm32-unknown-unknown/debug/deps/rust_snake.5fgjih7crwhwn4xr.rcgu.o" "/home/kuba/Projects/rust-snake/target/wasm32-unknown-unknown/debug/deps/rust_snake.5fkqw2idrlv7jos5.rcgu.o" "-o" "/home/kuba/Projects/rust-snake/target/wasm32-unknown-unknown/debug/deps/rust_snake.wasm" "--export" "main" "--export" "__web_malloc" "--export" "__web_free" "--export=__heap_base" "--export=__data_end" "/home/kuba/Projects/rust-snake/target/wasm32-unknown-unknown/debug/deps/rust_snake.2l9dobmrlqco0sju.rcgu.o" "--gc-sections" "-O0" "-L" "/home/kuba/Projects/rust-snake/target/wasm32-unknown-unknown/debug/deps" "-L" "/home/kuba/Projects/rust-snake/target/debug/deps" "-L" "/home/kuba/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-unknown/lib" "/home/kuba/Projects/rust-snake/target/wasm32-unknown-unknown/debug/deps/libstdweb-ef476852d27a12c5.rlib" "/home/kuba/Projects/rust-snake/target/wasm32-unknown-unknown/debug/deps/libdiscard-a83cebb0a142eb8f.rlib" "/home/kuba/Projects/rust-snake/target/wasm32-unknown-unknown/debug/deps/libstdweb_internal_runtime-0bce6e61d1817cf7.rlib" "/home/kuba/Projects/rust-snake/target/wasm32-unknown-unknown/debug/deps/libserde_json-1c98a67e94d08af3.rlib" "/home/kuba/Projects/rust-snake/target/wasm32-unknown-unknown/debug/deps/libryu-322b81c9b49f7e9f.rlib" "/home/kuba/Projects/rust-snake/target/wasm32-unknown-unknown/debug/deps/libitoa-a7c2d7644820b152.rlib" "/home/kuba/Projects/rust-snake/target/wasm32-unknown-unknown/debug/deps/libserde-c2f4e30465155451.rlib" "/home/kuba/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-unknown/lib/libstd-9c867bc4c16ee4c2.rlib" "/home/kuba/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-unknown/lib/libpanic_abort-ed0cd729c2f3d142.rlib" "/home/kuba/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-unknown/lib/libdlmalloc-030f419e714a0cc6.rlib" "/home/kuba/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-unknown/lib/libhashbrown-a12a1f881dba75e1.rlib" "/home/kuba/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-unknown/lib/librustc_std_workspace_alloc-35aa06e58878157c.rlib" "/home/kuba/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-unknown/lib/libbacktrace-6636ad5f40fe0c6e.rlib" "/home/kuba/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-unknown/lib/librustc_demangle-3c1019358081106e.rlib" "/home/kuba/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-unknown/lib/libunwind-b93526bae6789131.rlib" "/home/kuba/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-unknown/lib/libcfg_if-12a659b7ffc8c645.rlib" "/home/kuba/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-unknown/lib/liblibc-62025a1d48e0630e.rlib" "/home/kuba/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-unknown/lib/liballoc-80234d57a1442351.rlib" "/home/kuba/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-unknown/lib/librustc_std_workspace_core-d429e78abfaecaef.rlib" "/home/kuba/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-unknown/lib/libcore-c485e95495d6739c.rlib" "/home/kuba/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/wasm32-unknown-unknown/lib/libcompiler_builtins-53d1b7f6a2bd6c6f.rlib" "-fuse-ld=gold"
  = note: rust-lld: error: unknown argument: -fuse-ld=gold


error: aborting due to previous error
error: could not compile `rust-snake`.

我认为一些其他信息可能会有用:

cargo 版本:cargo 1.41.0-nightly (626f0f40e 2019-12-03)〜/.cargo/config的内部:
[target.arm-unknown-linux-gnueabihf]
linker = "arm-linux-gnueabihf-gcc-7"

任何帮助,将不胜感激 :)

编辑:我正在使用“elementary os”(基本上是带有较酷的ui的ubuntu)。而尝试建立稳定会给我完全相同的错误。

Edit2:rustup show返回
rustup home:  /home/kuba/.rustup

installed toolchains
--------------------

stable-x86_64-unknown-linux-gnu (default)
nightly-x86_64-unknown-linux-gnu

installed targets for active toolchain
--------------------------------------

arm-unknown-linux-gnueabihf
armv7-unknown-linux-gnueabihf
wasm32-unknown-unknown
x86_64-unknown-linux-gnu

active toolchain
----------------

stable-x86_64-unknown-linux-gnu (default)
rustc 1.40.0 (73528e339 2019-12-16)

Edit3:cargo-web --version返回cargo-web 0.6.26

最佳答案

您的链接器或编译器设置未正确设置或以某种方式更改。

error: unknown argument: -fuse-ld=gold



-fuse-ld=goldRUSTFLAGS环境变量或编译器选项中删除gold linker标志:LD

使用详细标志(-v--verbose)查看详细输出:

cargo web build -v --target=wasm32-unknown-unknown

WebAssembly是快速,安全的便携式,并且是开放式Web平台的一部分。
因此,WebAssembly是平台独立的(您无需将其编译为ARM,并且它是基于虚拟机的,因此您需要主机来运行WebAssembly,例如在WebAssembly的Web浏览器JavaScript VM中。还有WASI: WebAssembly System Interface) 。

由于它是便携式:
您可以在任何计算机上使用可运行的编译器对其进行构建,然后仅将.wasm文件复制到目标Web服务器计算机上。

要从头开始创建Web hello世界示例:

rustup target add wasm32-unknown-unknown

# https://github.com/koute/stdweb
cargo search cargo-web
# cargo-web = "0.6.26"          # A Cargo subcommand for the client-side Web
# cargo install cargo-web --version 0.6.26
cargo install cargo-web
file ~/.cargo/bin/cargo-web
cargo-web --version
# cargo-web 0.6.26

# create new project e.g. "123stdweb-rs-js"
cargo new 123stdweb-rs-js
cd 123stdweb-rs-js

cargo search stdweb

[dependencies]之后添加到Cargo.toml文件末尾:
stdweb = "0.4.20"  # A standard library for the client-side Web
main.rs文件:
use stdweb;
use stdweb::js;

fn main() {
    stdweb::initialize();
    let message = "Hello from stdweb.";
    let result = js! {
        alert( @{message} );
        return 2 + 2 * 2;
    };
    println!("2 + 2 * 2 = {:?}", result);
    stdweb::event_loop();
}

构建并运行Web服务器以提供target/wasm32-unknown-unknown/debug/stdweb-rs-js.js:

# Compile to WebAssembly using Rust's native WebAssembly backend:
cargo web start --target=wasm32-unknown-unknown

打开您的网络浏览器http://localhost:8000:

firefox http://localhost:8000

完毕。

您可以发布构建:
cargo web build --release --target=wasm32-unknown-unknown
mkdir static
cp target/wasm32-unknown-unknown/release/stdweb-rs-js.js ./static/
cp target/wasm32-unknown-unknown/release/stdweb-rs-js.wasm ./static/

现在,您可以使用自己喜欢的静态网络服务器来提供stdweb-rs-js.jsstdweb-rs-js.wasm文件,例如使用简单的python3 -m http.server 8080文件的./static/index.html:
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
  </head>
  <body>
    Right click <b>Inspect</b> then click <b>Console</b> tab
    <hr />

    <script src="stdweb-rs-js.js"></script>
  </body>
</html>

就这样。

我希望这有帮助。

关于rust - Rust stdweb无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59458837/

相关文章:

rust - 为 Rust 中的特征提供类似继承的行为

c++ - 如何从Rust调用C++动态库?

rust - FromWasmAbi 没有为 fn(SomeStruct) 实现,而 SomeStruct 是 #[wasm_bindgen]

recursion - 递归宏使无限递归

linker - Cargo 创建空的 ELF 文件

rust - 为什么我不能取消引用或添加泛型类型,即使我正在传递一个可以取消引用和添加的类型?

enums - 我可以使用枚举作为另一个枚举的值检查器吗?

blazor - 如何正确部署 Blazor WebAssembly(托管)应用程序?

webassembly - 我的代码在 WebAssembly 中的私密性如何?

rust - 如何将我的库中的源文件导入 build.rs?