【发布时间】:2022-01-23 19:07:24
【问题描述】:
我正在尝试将包含由 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
这是链接阶段出现问题的地方,emcc 报告 __wbg_log_941ab916ed5a24bd 是一个未定义的符号。我怀疑这个符号(以及其他符号)正在作为优化工作的一部分被删除,但我不确定在哪个阶段或如何禁用此优化。
在 CMake 中添加以下链接器选项会导致编译时出现关于未定义符号的警告:
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-bindgen(CLI 工具)时,我收到以下错误:
import of `__wbg_log_941ab916ed5a24bd` doesn't have an adapter listed
如何防止 wasm-bindgen 导入/导出的函数在此过程中被剥离?
【问题讨论】:
标签: c rust ffi emscripten wasm-bindgen