2017-01-05 9 views
4

У меня есть библиотека Rust со следующей обычной структурой:Как вы можете скомпилировать библиотеку 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)); 

Однако Ржавчина жалуется на директиву #[link_args...] как устаревшую. Есть ли какая-либо документация, которая может объяснить, как это работает?

+0

Вы видели [Компилирование Rust для вашего браузера] (http://www.hellorust.com/emscripten/)? – Shepmaster

+0

Да, я просмотрел его, но я мог что-то упустить. Единственные образцы кода (в ржавчине), которые я видел, просто аннотировали публичные функции с # [no_mangle]. На мой взгляд, это не работает. Я заметил, что они использовали rustc вместо груза ...? Эта [ссылка] (http://www.hellorust.com/emscripten/demos/04-call-into-lib/), по-видимому, является источником комментариев пользователей выше, но link_args по-прежнему не рекомендуется - и какова сделка с пустым main() {}? – user1935361

ответ

2

Очень интересный вопрос! Я бежал в similar dependency issues с fable.

Я проверил Compiling Rust to your Browser - Call from JavaScript, Advanced Linking - Link args и How to pass cargo linker args, однако, был не в состоянии использовать cargo таким же образом, как rustc --target asmjs-unknown-emscripten call-into-lib.rs.

Чем ближе я смог был бежать как cargo и rustc как

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.