2017-01-05 38 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傳遞給它。