2017-01-05 10 views
4

私は、次の通常の構造の錆のライブラリを持っている:私はcargo buildを行うとRustライブラリをコンパイルしてasm.jsをターゲットにするにはどうすればよいですか?

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

、私は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 to Your Browser](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 argsをチェックしているとHow 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を渡すことができます。

関連する問題