在rust中调用C中的函数,打包成wasm时无法使用wasmer等运行时运行
写了一个简单的rust调用c的例子
// main.rs
#[link(name = "setsock", kind = "static")]
extern "C" {
fn my_lib();
}
#[no_mangle]
pub fn test() {
unsafe {
my_lib();
}
}
pub fn main() {
test();
}
// main.c
#include <stdio.h>
extern void my_lib();
void my_lib() {
printf("test");
}
// build.rs
use cc;
fn main() {
cc::Build::new()
.file("src/main.c")
// 这里引用的include是c的标准库,是因为在打包时会报错找不到c的头文件,本机没有安装xcode,所以是用的另外下的头文件,手动引入
.include("src/include")
.compile("setsock");
}
// Cargo.toml
[package]
name = "rust1"
version = "0.1.0"
edition = "2021"
build = "src/build.rs"
[lib]
crate-type = ['cdylib']
打包命令
cargo build --target=wasm32-wasi
使用wasmer运行
从错误中可以看到是识别不了我自己写的C库,其不属于wasi标准,所以报错。
查看wasm转为wat的文件
这个引入为我自己写的C,运行时无法读取,看上去在打包成wasm时并没有把C里面的东西打进去。所以有没有办法将C里面的东西都打到wasm里面去(按照wasi的目标),这样就可以实现在wasmer等运行时中运行。
本机环境
macos big sur 11.5.2