如何编译Rust库以定位asm.js?

use*_*361 5 rust asm.js rust-cargo

我有一个具有以下通常结构的Rust库:

Cargo.toml
src
 |--lib.rs
.cargo
 |--config (specifies target=asmjs-unknown-emscripten)
target
 |......
Run Code Online (Sandbox Code Playgroud)

当我这样做时cargo build,我在目标下调用了一个新目录asmjs-unknown-emscripten,但是我期望的.js文件不存在.

正如这位用户所说,除了将它们公开之外,你还需要做一些特殊的事情来将函数导出到asm.js:

基本上你现在有这个样板:

#[link_args = "-s EXPORTED_FUNCTIONS=['_hello_world']"]
extern {}

fn main() {}

#[no_mangle]
pub extern fn hello_world(n: c_int) -> c_int {
    n + 1
}
Run Code Online (Sandbox Code Playgroud)

然后你可以在你的javascript中使用它来访问和调用函数:

var hello_world = cwrap('hello_world', 'number', ['number']);

console.log(hello_world(41));
Run Code Online (Sandbox Code Playgroud)

但是,Rust抱怨该#[link_args...]指令已被弃用.有没有可以解释这是如何工作的文件?

dav*_*ola 2

非常有趣的问题!我在fable上遇到了类似的依赖问题

我已经检查了将 Rust 编译到浏览器 - 从 JavaScript 调用高级链接 - 链接参数如何传递货物链接器参数,但是无法以cargorustc --target asmjs-unknown-emscripten call-into-lib.rs.

我越接近,就越能同时运行cargorustc喜欢

cd lib1
cargo build --target asmjs-unknown-emscripten
rustc --target=asmjs-unknown-emscripten src\lib.rs
cd ..

cd lib2
cargo build --target asmjs-unknown-emscripten
rustc --target=asmjs-unknown-emscripten src\lib.rs --extern lib1=..\lib1\target\asmjs-unknown-emscripten\debug\liblib1.rlib
cd ..

cd lib3
cargo build --target asmjs-unknown-emscripten
rem rustc --target=asmjs-unknown-emscripten src\lib.rs --extern webplatform=..\lib3\target\asmjs-unknown-emscripten\debug\deps\libwebplatform-80d107ece17b262d.rlib
rem the line above fails with "error[E0460]: found possibly newer version of crate `libc` which `webplatform` depends on"
cd ..

cd app
cargo build --target asmjs-unknown-emscripten
cd ..
Run Code Online (Sandbox Code Playgroud)

请参阅so-41492672-rust-js-struct。它允许在最终应用程序中将多个库一起编译为 JavaScript。

我仍然认为一些手动链接会有帮助。有兴趣知道。

PS看看有什么rustc用的链接,可以传给-Z print-link-args它。