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

时间:2017-01-05 19:00:43

标签: rust rust-cargo asm.js

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

OPTIONS={
    'libraries': {
        'myapp_tags': 'path.to.myapp.tags',
        'project_tags': 'project.templatetags.common_extras',
        'admin.urls': 'django.contrib.admin.templatetags.admin_urls',
    },
}

当我执行Cargo.toml src |--lib.rs .cargo |--config (specifies target=asmjs-unknown-emscripten) target |...... 时,我会在目标cargo build下获得一个新目录,但我所期望的.js文件不存在。

As this user notes,你必须做一些特别的事情来将函数导出到asm.js,除了将它们标记为公开:

  

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

asmjs-unknown-emscripten
     

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

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

fn main() {}

#[no_mangle]
pub extern fn hello_world(n: c_int) -> c_int {
    n + 1
}

然而,Rust抱怨var hello_world = cwrap('hello_world', 'number', ['number']); console.log(hello_world(41)); 指令已弃用。有没有可以解释这是如何工作的文件?

1 个答案:

答案 0 :(得分:2)

非常有趣的问题!我与similar dependency issues一起遇到了fable

我已检查Compiling Rust to your Browser - Call from JavaScriptAdvanced Linking - Link argsHow to pass cargo linker args,但无法像rustc --target asmjs-unknown-emscripten call-into-lib.rs那样使用cargo

我能够获得的更接近的是同时运行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 ..

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

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

P.S。要查看rustc用于链接的内容,您可以将-Z print-link-args传递给它。