静态库、动态库和 ABI
前面几篇讲的是函数级 FFI:extern "C"、字符串、内存归属、回调和 void *ctx。
真正交付给 C 项目时,还要回答另一个问题:
C 工程到底链接什么文件?
头文件声明哪些符号?
这些符号的 ABI 能不能长期稳定?
升级 Rust 代码后,C 侧要不要改?
C 开发者熟悉 .a、.so、.h 和 ABI。Rust 交付给 C 使用时,也要回到这些概念,而不是把 Cargo 内部模型暴露给 C。
前面几篇讲的是函数级 FFI:extern "C"、字符串、内存归属、回调和 void *ctx。
真正交付给 C 项目时,还要回答另一个问题:
C 工程到底链接什么文件?
头文件声明哪些符号?
这些符号的 ABI 能不能长期稳定?
升级 Rust 代码后,C 侧要不要改?
C 开发者熟悉 .a、.so、.h 和 ABI。Rust 交付给 C 使用时,也要回到这些概念,而不是把 Cargo 内部模型暴露给 C。
让 C 调用 Rust,不是把 Rust 函数原样暴露给 C。
C 能理解的是 C ABI:符号名、调用约定、整数、指针、结构体布局、谁分配内存、谁释放内存、错误怎么返回。Rust 内部的 String、Vec、Result、trait、panic,都不应该直接跨过 C 边界。