2017-01-05 36 views
4

我有一个生锈库如下常用结构:如何编译一个Rust库来定位asm.js?

Cargo.toml 
src 
|--lib.rs 
.cargo 
|--config (specifies target=asmjs-unknown-emscripten) 
target 
|...... 

当我做cargo build,我得到下目标调用asmjs-unknown-emscripten一个新的目录,但我期望的.js文件不存在。

As this user notes,你必须做一些特殊的导出功能,除了它们标记公众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 
} 

然后你可以在您的JavaScript中使用此访问和调用功能:

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

console.log(hello_world(41)); 

但是,Rust抱怨#[link_args...]指令已过时。有没有任何文件可以解释这是如何工作的?

+0

你见过[编译Rust到你的浏览器](http://www.hellorust.com/emscripten/)? – Shepmaster

+0

是的,我掠过它,但我可能会错过一些东西。我看到的唯一代码示例(锈蚀)只是用#[no_mangle]注释公共函数。这似乎不适用于我的目的。我注意到他们正在使用rustc而不是货物......?这个[link](http://www.hellorust.com/emscripten/demos/04-call-into-lib/)似乎是上面用户评论的来源,但link_args仍然被弃用 - 这是怎么回事与空的main(){}? – user1935361

回答

2

非常有趣的问题!我遇到similar dependency issuesfable

我已经检查Compiling Rust to your Browser - Call from JavaScriptAdvanced Linking - Link argsHow to pass cargo linker args但无法使用cargo以同样的方式为rustc --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 .. 

看到so-41492672-rust-js-structure。它允许有几个库在最终应用程序中一起编译为JavaScript。

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

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