![](/img/trans.png)
[英]How does the Rust compiler make sense of log_u32 and log_many in the wasm-bindgen example below?
[英]How can I use wasm-bindgen from a program compiled with Emscripten?
我正在嘗試將包含由 wasm-bindgen 生成的代碼的 Rust 庫與我想用 Emscripten 編譯的 C 編寫的程序鏈接。 我的MRE如下:
在 Rust 方面,我有Cargo.toml
:
[package]
name = "rust_project"
version = "0.1.0"
edition = "2021"
[lib]
crate-type = ["staticlib"]
[dependencies]
wasm-bindgen="0.2"
在lib.rs
我有:
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
extern "C" {
#[wasm_bindgen(js_namespace = console)]
fn log(s: &str);
}
#[no_mangle]
pub extern "C" fn call_from_c() {
log("Hello, World!");
}
作為第一步,我使用cargo build --target wasm32-unknown-unknown
編譯它,它會生成一個librust_project.a
。 然后我使用main.c
設置以下 C 項目:
/* forward declare the function from Rust */
void call_from_c();
/* call the function from main */
int main() {
call_from_c();
return 0;
}
和CMakeLists.txt
:
cmake_minimum_required(VERSION 3.5)
project(c_project)
add_executable(c_project main.c)
target_link_libraries(c_project /path/to/librust_project.a)
最后,我嘗試使用 Emscripten 工具鏈將它們組合在一起,如下所示:
cmake -DCMAKE_TOOLCHAIN_FILE=path/to/Emscripten.cmake ../
make
這是 go 在鏈接階段出現錯誤的地方, emcc
報告__wbg_log_941ab916ed5a24bd
是一個未定義的符號。 我懷疑這個符號(以及其他符號)正在作為優化工作的一部分被刪除,但我不確定在哪個階段或如何禁用此優化。
在 CMake 中添加以下 linker 選項會導致編譯時出現關於未定義符號的警告:
target_link_libraries(c_project
path/to/librust_project.a
"-s EXPORTED_FUNCTIONS=[\"_main\",\"___wbg_log_941ab916ed5a24bd\"]"
"-s ERROR_ON_UNDEFINED_SYMBOLS=0")
但我相信這些丟失的符號是有問題的,當我在 c_project.wasm 上運行 wasm- c_project.wasm
(CLI 工具)時,我收到以下錯誤:
import of `__wbg_log_941ab916ed5a24bd` doesn't have an adapter listed
如何防止 wasm-bindgen 導入/導出功能在此過程中被剝離?
這是一個正在進行中的答案,希望我能在不久的將來變成一個完整的答案。 如果不是,它至少可以作為其他走這條路的人的起點。
我一直在努力通過刪除 CMake 和 Emscripten 並直接使用 Clang 編譯來使我的 MWE 變得更小。 這已經足夠了,因為我不需要擔心這個 MWE 中的標准庫。
然后我的編譯命令變為:
clang -Wall --target=wasm32-unknown-unknown --no-standard-libraries \
-Wl,--export-all \
-Wl,--no-entry \
-Wl,-L/path/to/librust_project_a
-Wl,-lrust_project
-o main.wasm main.c
值得注意的是,我可以通過添加/刪除--export-all
linker 參數來觸發以下 wasm-bindgen 錯誤。 建議 LLVM linker 負責在使用 wasm-bindgen 處理之前刪除此部分。
import of `__wbg_log_941ab916ed5a24bd` doesn't have an adapter listed
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.