簡體   English   中英

如何從用 Emscripten 編譯的程序中使用 wasm-bindgen?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM