当前位置: 首页 > news >正文

rust学习-引用C库

link和extern

#[link(name = "...")] 是一个用于链接外部库的属性宏。
可以在 Rust 代码中引入其他语言编写的动态链接库(.so.dll 等文件),从而实现 Rust 和其他语言的互操作。

#[link(name = "...")] 属性宏用于在 Rust 模块中引入标准 C 库(如 math.h 等)和其他外部库。
name 参数用于指定需要链接的外部库的名称,可以是一个直接指定的库名,也可以是一个在目标系统上查找库文件的函数或脚本。

#[link(name = "m")]
// 使用 `extern "C"` 声明了一个 C 的函数 `sqrt`,用于计算浮点数的平方根
extern "C" {fn sqrt(x: f64) -> f64;
}fn main() {let x = 2.0_f64;let y = unsafe { sqrt(x) };println!("sqrt({}) = {}", x, y);
}

#[link] 导入的库,Rust 无法保证库函数的安全性和稳定性
如果在代码中使用这些链接库,特别注意内存安全和互操作性方面的问题
并仔细地读取库文档以保证代码的正确性和可靠性

由于链接库的具体名称和位置可能会随着不同的系统环境而有所不同
因此在使用 #[link] 属性宏时需要进行相应的参数配置

repr

#[repr(C)] 是一个用于将 Rust 数据类型与 C 语言联接的属性宏。
用于强制 Rust 编译器使用与 C 语言兼容的布局和对齐方式,从而确保 Rust 类型和 C 语言类型的兼容性避免出现内存对齐错误和二进制数据结构不匹配等问题

具体来说,#[repr(C)] 属性宏强制 Rust 使用传统的 C 语言内存布局方式,即结构体成员的偏移量和大小按照编译器默认的对齐方式进行处理
因此,当 Rust 结构体和 C 语言函数或库进行互操作时,应该使用这个属性宏来确保数据类型的一致性

#[repr(C)]
struct MyStruct {x: i32,y: f32,
}#[link(name = "m")]
extern "C" {fn expf(x: f32) -> f32;
}fn main() {let mut my_struct = MyStruct { x: 123, y: 4.56 };unsafe {// 用于计算输入值的自然指数my_struct.y = expf(my_struct.y); // 调用 C 语言库函数}println!("x = {}, y = {}", my_struct.x, my_struct.y);
}

#[repr(C)] 属性宏使得 Rust 具有了与 C 语言互操作的能力,但需要特别小心,以确保内存的安全和正确性。因此,在使用 #[repr(C)] 属性宏时,需要添加额外的测试和检查机制来确保代码的正确性和可靠性。

示例1

use std::fmt;// 这个 extern 代码块链接到 libm 库
#[link(name = "m")]
extern {// 这个外部函数用于计算单精度复数的平方根fn csqrtf(z: Complex) -> Complex;// 这个用来计算单精度复数的复变余弦fn ccosf(z: Complex) -> Complex;
}// 由于调用其他语言的函数被认为是不安全的,我们通常会给它们写一层安全的封装
fn 
http://www.lryc.cn/news/146815.html

相关文章:

  • WebAssembly 在云原生中的实践指南
  • Azure sqlserver 更改字符集
  • git push时,由于commit了大文件无法成功push的解决办法
  • 2023_Spark_实验一:Windows中基础环境安装
  • 如何在Windows / Mac / iPhone / Android / Online上将MP4转换为MP3
  • 【App端】uni-app使用百度地图api和echarts省市地图下钻
  • 深度学习(十)--- cv2.pointPolygonTest() 判断一点是否在指定区域内
  • 后端面试话术集锦第 八 篇:redis面试话术
  • LiteOS qemu realview-pbx-a9 环境搭建与运行
  • Kubernetes技术--Kubernetes架构组件以及核心概念
  • 拿来即用修改密码功能
  • 违背原则才能写好代码(一)
  • 面试官眼中的理想候选人:如何成为他们的首选
  • ES6中的扩展运算符你真的会用吗?
  • 利用逻辑回归判断病人肺部是否发生病变
  • 全民健康生活方式行动日,天猫健康联合三诺生物推出“15天持续测糖计划”
  • 设计模式行为型-状态模式
  • 弹窗、抽屉、页面跳转区别 | web交互入门
  • 说说Flink运行模式
  • 视频汇聚/视频云存储/视频监控管理平台EasyCVR新增首次登录强制修改密码
  • C语言控制语句——分支语句
  • 音视频 fmpeg命令裁剪和合并视频
  • 机器学习基础17-基于波士顿房价(Boston House Price)数据集训练模型的整个过程讲解
  • 哈希的应用——布隆过滤器
  • LNMT的多机部署和双机热备
  • 软件测试/测试开发丨Pytest和Allure报告 学习笔记
  • 十七、命令模式
  • 服务器安装 anaconda 及 conda: command not found [解决方案]
  • 自动驾驶和辅助驾驶系统的概念性架构(二)
  • 【c++】VC编译出的版本,发布版本如何使用