rust - Rust ffi 以跨平台方式包含动态库
问题描述
我想在带有 FFI 的 Rust 中包含一个动态 C 库。
该库实际上也是用 Rust 构建的,但公开了一个 C 接口,因此它也可以从其他语言中使用。cdylib
当我用 cargo构建库(类型:)时,我.dylib
在 MacOS 上得到 a ,在 windows 上得到.dll
一个文件。.dll.lib
这些库也有不同的名称,源自项目名称(libmy_lib.dylib
在 MacOS 和my_lib.dll
Windowsmy_lib.dll.lib
上)。
我想以跨平台的方式引用这些文件。因为目前我必须使用
#[link(name = "my_lib.dll", kind = "dylib")]
在 Windows 上,而在 MacOS 上我需要使用
#[link(name = "my_lib", kind = "dylib")]
我已经尝试将其重命名my_lib.dll.lib
为my_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
推荐阅读
- eclipse - 使用 @RequestMapping 时出现编译错误 - 无法解析类型
- python - 如何在熊猫中选择哪些值以特定值开头和结尾的行?
- javascript - React.js 中要求 nodemailer 的问题;
- javascript - 在同一个 Ajax 请求中提交一个传统的 JavaScript 对象和一个 jQuery 对象
- elixir - ExMachina“嵌套”构建
- arrays - 从数组中删除重复的 PHAsset?
- javascript - 为购物车中的商品创建有效负载数组
- rust - 为什么我的 Result 类型别名不满足 failure::Fail 特征绑定?
- swift - UIViewAnimation with constraint not working in Swift
- http-headers - 在最小的 Web 应用程序上启用 Content-Security-Policy