首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何链接Rust WASI中的C库

如何链接Rust WASI中的C库
EN

Stack Overflow用户
提问于 2022-09-05 21:26:51
回答 1查看 171关注 0票数 3

我想在我的铁锈-瓦西程序中使用C库。但我在连接外部库时遇到了困难。我现在的安排是这样的。

main.rs

代码语言:javascript
复制
#[link(name = "mylib")]
extern "C" {
    pub fn add_one(i: i32) -> i32;
}

pub fn main() {
    let res = unsafe { add_one(10) };
    println!("I + 1: {}", res);
}

https://github.com/codeplea/tinyexpr mylib.cpp

代码语言:javascript
复制
#include "tinyexpr.h"

extern "C" int add_one(int i)
{
    te_interp("i + 1", 0);
    return i + 1;
}

build.rs

代码语言:javascript
复制
fn main() {
    cc::Build::new()
        .archiver("llvm-ar")
        .cpp_link_stdlib(None)
        .cpp(true)
        .flag("--sysroot=/opt/wasi-sysroot/")
        .file("mylib.cpp")
        .compile("libmylib.a");
}

当我尝试用wasmtime执行它时,会导致此错误。

代码语言:javascript
复制
cargo build --target wasm32-wasi --release 
wasmtime --dir=. --dir=/tmp target/wasm32-wasi/release/reverser.wasm
代码语言:javascript
复制
Error: failed to run main module `target/wasm32-wasi/release/so.wasm`

Caused by:
    0: failed to instantiate "target/wasm32-wasi/release/so.wasm"
    1: unknown import: `env::te_interp` has not been defined

我没有任何问题链接到sys根目录中的标题。仅在同一个目录中使用c#头

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-05 23:25:07

tinyexpr不仅是一个标头库,还需要编译tinyexpr.c

代码语言:javascript
复制
cc::Build::new()
    .archiver("llvm-ar")
    .flag(&sysroot)
    .file("tinyexpr.c")
    .compile("tinyexpr");

虽然您不一定需要给它自己的库,但是您也可以将tinyexpr.cmylib.cpp编译成同一个.a。根据我对C/C++构建过程的理解,这应该会给出相同的结果。

如果您想真正做到这一点,您可以制作一个新的tinyexpr-sys机箱,其中只包含tinyexpr.c (外加一个cbindgen-generated lib.rs)。

附带注意:为了找到sysroot,我会使用这样的方法

代码语言:javascript
复制
let sysroot = var("MYLIB_WASI_SYSROOT")
    .or(var("WASI_SYSROOT"))
    .ok()
    .or_else(|| Some(format!("{}/share/wasi-sysroot", var("WASI_SDK_PATH").ok()?)));
let sysroot = match sysroot {
    Some(sysroot) => format!("--sysroot={}", sysroot),
    None => {
        eprintln!(
            "Install wasi-sdk or wasi-libc and specify WASI_SYSROOT path in environment!"
        );
        exit(1);
    }
};

不过,您也可以期望人们设置CFLAGS/CXXFLAGS

其他边注:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73614800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档