gpt4 book ai didi

Rust ffi 以跨平台方式包含动态库

转载 作者:行者123 更新时间:2023-12-03 11:43:52 50 4
gpt4 key购买 nike

我想在带有 FFI 的 Rust 中包含一个动态 C 库。
该库实际上也是用 Rust 构建的,但公开了一个 C 接口(interface),因此它也可以从其他语言中使用。当我用 cargo 构建库(类型:cdylib)时,我得到一个 .dylib在 MacOS 和 .dll 上以及 .dll.lib windows 上的文件。这些库也有不同的名称,源自项目名称(libmy_lib.dylib 在 MacOS 上和 my_lib.dll 以及 my_lib.dll.lib 在 Windows 上)。
我想以跨平台的方式引用这些文件。因为目前我必须使用

#[link(name = "my_lib.dll", kind = "dylib")]
在 Windows 上,而在 MacOS 上我需要使用
#[link(name = "my_lib", kind = "dylib")]
我已经尝试重命名 my_lib.dll.libmy_lib.lib ,但我仍然得到一个链接器错误,说 LINK : fatal error LNK1181: cannot open input file 'my_lib.lib'如何引用这些文件,以便我可以将我的代码用于 Mac 和 Windows?如果只有 cfg_attr 才有可能标签我也会接受。理想情况下,我也想摆脱 .lib如果可能的话,为 windows 文件。

最佳答案

您可以使用 crate libloading
例子:

let lib = unsafe {
#[cfg(unix)]
let path = "mylib.so";
#[cfg(windows)]
let path = "mylib.dll";
libloading::Library::new(path).expect("Failed to load library")
};
let func: libloading::Symbol<unsafe extern fn() -> u32> = unsafe {
lib.get(b"my_func").expect("Failed to load function `my_func`")
};
// Can call func later while `lib` in scope

关于Rust ffi 以跨平台方式包含动态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66313302/

50 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com