< 返回版块

heliping 发表于 2023-10-09 17:03

请教个rust的动态库的问题,c系列可以生成动态库,其他的模块使用动态库就行了。

类似的rust这块这种合作方式是什么样子的?

比如我一个收发消息的组件,10个模块都需要它,c类可以使用动态库,

rust怎么办?每个组件都引入包,那每个组件都很大,有朋友碰到过吗?

评论区

写评论
bestgopher 2023-10-09 21:02

cdylib了解下

--
👇
heliping: dylib

dylib用于将该依赖编译为动态库, 这样依赖其的bin类型crate会在运行前由操作系统的动态库加载器加载该依赖.其产生的文件扩展名在Linux上为so, Windows上为dll, macOS/iOS上为dylib, 且Linux的文件名具有lib的前缀.

我们随后会发现rust生成的dylib和C语言库略有不同, 这导致其用法也发生了很大的变化.在目前, dylib几乎只能作为cargo编译的中间产物使用, 就像rlib一样.

---这能用吗?

--
👇
bestgopher: 你不都说了,动态库啊

恐咖兵糖 2023-10-09 20:55

补充一下,给 python 写模块,写 WASM ,给 Lua 写模块我看到的都用的 cdylib 。

不过 rlib 平台无关倒是感觉足够 Rust 模块之间复用了,然后其他语言需要的地方 cdylib 包一层生成 .so

恐咖兵糖 2023-10-09 20:41

cdylib 大概可行,试过用 mlua 库给 Lua 写模块,生成类型就是 cdylib 的 .so 。

其实有文章讲过 https://rustcc.cn/article?id=98b96e69-7a5f-4bba-a38e-35bdd7a0a7dd&current_page=1

以及 RustFFI的文章 https://rustcc.cn/article?id=28e2bd78-99fc-436b-b48a-d7b5a00b1109

然后 dylib 确实是 Rust 动态库,而遵循 c 约定的 cdylib 对其他语言调用支持就比较好。

DDD 2023-10-09 17:23

把相应的rust库编译成dylib,其他的rust组件去调用这个编译好的dylib就可以了

作者 heliping 2023-10-09 17:16

dylib

dylib用于将该依赖编译为动态库, 这样依赖其的bin类型crate会在运行前由操作系统的动态库加载器加载该依赖.其产生的文件扩展名在Linux上为so, Windows上为dll, macOS/iOS上为dylib, 且Linux的文件名具有lib的前缀.

我们随后会发现rust生成的dylib和C语言库略有不同, 这导致其用法也发生了很大的变化.在目前, dylib几乎只能作为cargo编译的中间产物使用, 就像rlib一样.

---这能用吗?

--
👇
bestgopher: 你不都说了,动态库啊

bestgopher 2023-10-09 17:15

你不都说了,动态库啊

1 共 6 条评论, 1 页