Как вы можете скомпилировать библиотеку Rust для цели asm.js?

У меня есть библиотека Rust со следующей обычной структурой:

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

Когда я делаю cargo buildЯ получаю новый каталог под названием target asmjs-unknown-emscripten, но файлы.js, которых я ожидал, там нет.

Как отмечает этот пользователь, вы должны сделать что-то особенное для экспорта функций в 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...] Директива устарела. Есть ли документация, которая может объяснить, как это работает?

1 ответ

Очень интересный вопрос! Я столкнулся с аналогичными проблемами зависимости с басней.

Я проверил компиляцию Rust в вашем браузере - вызов из JavaScript, расширенные ссылки - аргументы ссылок и как передать аргументы грузовых компоновщиков, однако не смог использовать 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. Это позволяет иметь несколько библиотек, которые компилируются вместе с JavaScript в конечном приложении.

Я все еще думаю, что некоторые ручные ссылки помогут. Было бы интересно узнать.

PS чтобы посмотреть что rustc использует для ссылки, вы можете передать -Z print-link-args к этому.

Другие вопросы по тегам