Node_Rust动态库
2024-03-13 本文已影响0人
空腹无才
Rust 动态链接库
什么是动态库
动态库是一种包含可重用代码和数据的文件,可以在程序运行时被加载和执行。动态库通常包含一组函数或程序模块,可以被多个程序共享和调用。与静态库不同的是,动态库在程序运行时才会被加载到内存中,可以减少程序的内存占用和提高程序的灵活性和可维护性。动态库的文件扩展名通常为.dll(在Windows系统中)或.so(在Linux系统中)。
RUST 部分
- 创建Rust项目
cargo new my_project
- 新建 lib.rs 包文件,并写入需要运行的内容
src/lib.rs
// no_mangle 修饰符用于告诉编辑器,不要修改函数或者静态变量名称
#[no_mangle]
pub extern fn add_number(a: i32) -> i32 {
a + 0
}
- 修改Cargo.toml 配置,添加如下内容
# [lib] 用于创建一个library库
[lib]
# 库名
name = "chris_math"
# 库类型 rlib 用于Rust 项目使用的静态库, cdylib 兼容C 的动态库,用于与其他语言交互
# cdylib 各平台生成的动态库
# Windows:.dll
# Linux:.so
# macOS:.dylib
crate-type = ["rlib", "cdylib"]
- 执行打包命令
cargo build
1710341932932-1710342106216-5.jpg打包命令执行完成后 ,回多出一个target文件夹,我们需要的动态库在 target/debug 中
Nodejs 部分
- 创建nodejs项目,初始化 package.json 文件
npm init -y
- 下载 ffi-napi 依赖
npm install ffi-napi -S
- 导入动态库
const fii = require("ffi-napi");
const path = require("path");
const _path = path.join(__dirname, "../chris_math/target/release/chris_math.dll"); // chris_math.dll 依赖库
const lib = fii.Library(_path, {
"add_number": ['int', ["int", "int"]] // 函数名:[返回值类型,[参数类型, 参数类型]]
const _res = lib.add_number(1,4);
console.log(_res)