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