如何使用 Emscripten 将 Rust 库与 C 应用程序链接到一个 WASM 文件中?

问题描述 投票:0回答:1

我有一个项目,它使用 Emscripten 将 C 库与 C 应用程序链接起来。我想用 Rust 编写的库替换 C 库。如何才能做到这一点?

我知道 Rust 中有两个相关的 WASM 目标,普通的

wasm32-unknown-unknown

 一个和 
wasm32-unknown-emscripten
 一个。我猜测后一个目标对于它与 Emscripten 编译器一起工作是必要的吗?但是我如何告诉 Emscripten 使用 .wasm 库而不是 .a 库?

可能还有其他方法将 Rust 和 C 代码链接到 .wasm 中,但我认为我确实需要坚持使用 Emscripten,因为我需要它的 Asyncify 功能(并且将来也会使用其 WASMFS 系统。)

rust build emscripten
1个回答
0
投票
这实际上非常简单!

首先,确保您的 Rust 项目设置为构建静态库:

[lib] crate-type=["staticlib"]
然后使用正确的目标编译你的 Rust 项目,

wasm32-unknown-emscripten

:

cargo build --target=wasm32-unknown-emscripten
然后您可以简单地将静态库链接到您的 C/C++ 应用程序中。请注意,您可能需要使用变量来处理开发和发布版本的不同路径。我正在使用 CMake:

if (${CMAKE_BUILD_TYPE} STREQUAL Release) set(REMGLK_RS_LIB_FOLDER ${CMAKE_CURRENT_SOURCE_DIR}/remglk/target/wasm32-unknown-emscripten/release) else() set(REMGLK_RS_LIB_FOLDER ${CMAKE_CURRENT_SOURCE_DIR}/remglk/target/wasm32-unknown-emscripten/debug) endif() target_link_libraries(app_target ${REMGLK_RS_LIB_FOLDER}/libremglk_capi.a)
最后,我需要将链接器语言更改为 C++,否则当最终应用程序仅是 C 而不是 C++ 时,使用 

panic!()

 似乎会导致异常错误。根据您使用的 Rust 功能,这可能不是必需的。

set_target_properties(app_target PROPERTIES LINKER_LANGUAGE CXX)
    
© www.soinside.com 2019 - 2024. All rights reserved.