Rust 虽然没有类似 C/C++ 的头文件(.h),但通过其 FFI(Foreign Function Interface)机制和编译工具链,可以高效地引用动态链接库(.so、.dll、.dylib)。以下是 Rust 引用动态链接库的核心机制和步骤:
1. 声明外部函数:extern "C" 块
Rust 通过 extern "C" 块声明动态链接库中的函数,明确函数签名(参数类型、返回类型)和调用约定(C ABI)。
- 示例:调用动态库
libexample.so中的函数add:extern "C"表示使用 C 语言的调用约定,确保 ABI 兼容性。- 函数需在
unsafe块中调用,因为 Rust 无法验证外部代码的安全性。
2. 链接动态库:#[link] 属性与构建脚本
Rust 通过以下两种方式指定动态库的链接信息:
#[link]属性:直接在代码中声明库名称:- 构建脚本
build.rs:动态配置库路径和链接方式: 这种方式更灵活,支持跨平台路径配置。
3. 类型兼容性与内存布局
- 基础类型映射:Rust 的
i32、f64等与 C 的int、double直接对应。 - 复杂类型:使用
#[repr(C)]保证结构体内存布局与 C 兼容: - 字符串处理:通过
std::ffi::CString和CStr转换 Rust 字符串与 C 风格字符串(*const c_char)。
4. 动态加载运行时库(可选)
若需运行时动态加载库(如插件系统),可使用 libloading 或 rust-dlopen 等库:
这种方式避免了静态链接的编译依赖。
5. 工具链支持
bindgen:自动从 C 头文件生成 Rust 绑定代码,适用于复杂库接口:生成的bindings.rs包含所有必要的extern声明和类型定义。cbindgen:反向生成 C 头文件(当 Rust 库被 C 调用时)。
6. 运行时环境配置
动态库需在运行时能被系统找到:
- Linux/macOS:设置
LD_LIBRARY_PATH或DYLD_LIBRARY_PATH:1export LD_LIBRARY_PATH=/path/to/libs:$LD_LIBRARY_PATH - Windows:将
.dll文件放在可执行文件同级目录或PATH环境变量中。
总结
Rust 通过以下机制替代头文件的作用:
- 函数声明:
extern "C"块明确接口。 - 类型安全:
#[repr(C)]和std::ffi模块处理兼容性。 - 工具链支持:
bindgen、cbindgen自动化绑定生成。 - 动态链接配置:构建脚本和运行时路径管理。
这种设计既保留了灵活性(如动态加载),又通过编译时检查(如类型和链接验证)确保了安全性。
本文发表于 0001-01-01,最后修改于 0001-01-01。
本站永久域名「 jiavvc.top 」,也可搜索「 极客油画 」找到我。

