rust跨平台调用动态库

ops/2025/2/4 4:08:46/

动态库在不同的操作系统,扩展名是不一样的,所以要做处理:

rust">
static LIB: Lazy<Mutex<Option<Library>>> = Lazy::new(|| Mutex::new(None));type CreateFunc = unsafe extern "C" fn(*const c_char, *const c_char) -> c_int;
type AddFunc =
unsafe extern "C" fn(*const c_char, *const c_char, *const c_char, *const c_char) -> c_int;type CreateFuncoracle = unsafe extern "C" fn(*const c_char, *const c_char) -> c_int;type AddFuncoracle =
unsafe extern "C" fn(*const c_char, *const c_char, *const c_char, *const c_char) -> c_int;
#[cfg(target_os = "windows")]
const LIB_NAME: &str = "test.dll";#[cfg(target_os = "macos")]
const LIB_NAME: &str = "./resources/test.dylib";#[cfg(target_os = "linux")]
const LIB_NAME: &str = "./resources/test.so";// 初始化全局变量
pub fn initialize_library() -> Result<(), ApiError> {let mut lib = LIB.lock().unwrap();*lib = Some(unsafe {Library::new(LIB_NAME).map_err(|e| {ApiError::InternalError(format!("无法加载库: {}", e))})?});Ok(())
}unsafe {let lib1 = LIB.lock().map_err(|e| { ApiError::InternalError(format!("无法加载库: {}", e)) })?;if let Some(ref lib) = *lib1 {// 获取 setdata_mssql_create 方法的符号let create: Symbol<CreateFunc> = lib.get(b"setdata_mssql_create").map_err(|e| { ApiError::InternalError(format!("无法加载函数: {}", e)) })?;//let connectionString = "Server=192.168.3.115;Database=testdb;User Id=sa;Password=****;TrustServerCertificate=True;";let c_stringconnectionString =CString::new(connectionString).map_err(|e| { ApiError::InternalError(format!("无法创建字符串: {}", e)) })?;let c_ptrconnectionString: *const c_char = c_stringconnectionString.as_ptr();let createString = sql.as_str();let c_stringcreateString =CString::new(createString).map_err(|e| { ApiError::InternalError(format!("无法创建字符串: {}", e)) })?;let c_ptrcreateString: *const c_char =c_stringcreateString.as_ptr();let result = create(c_ptrconnectionString,c_ptrcreateString,);if (result != 1) {warn!("表修改没有成功,详情请看日志文件,sql:{}",sql);return Err(ApiError::InternalError(format!("表修改没有成功,详情请看日志文件,sql:{}",sql)));}} else {println!("Library is not initialized");}}

部分代码摘自hpctb,实测方案可行。


http://www.ppmy.cn/ops/155470.html

相关文章

亚博microros小车-原生ubuntu支持系列:19 nav2 导航

开始小车测试之前&#xff0c;先补充下背景知识 nav2 Navigation2具有下列工具&#xff1a; 加载、提供和存储地图的工具&#xff08;地图服务器Map Server&#xff09; 在地图上定位机器人的工具 (AMCL) 避开障碍物从A点移动到B点的路径规划工具&#xff08;Nav2 Planner&a…

高速PCB设计指南2——PCB设计的信号完整性

高速PCB设计指南2——PCB设计的信号完整性 1. 信号完整性定义2. 信号完整性的需求3. 导致PCB中信号完整性的问题3.1 阻抗不连续3.2 反射、振铃、过冲3.3 串扰3.4 过孔残桩&#xff08;Stub&#xff09;3.5 偏移&#xff08;Jitter&#xff09;和抖动(Skew)3.6 信号衰减&#xf…

基于Docker以KRaft模式快速部署Kafka

参考文献 https://kafka.apache.org/37/documentation.html#uses https://spring.io/projects/spring-kafka#overview 获取Docker镜像 docker pull apache/kafka:3.7.1 创建一个目录来存储Kafka的配置文件 mkdir -p /home/user/kafka_config 启动Kafka容器 docker run …

RabbitMQ5-死信队列

目录 死信的概念 死信的来源 死信实战 死信之TTl 死信之最大长度 死信之消息被拒 死信的概念 死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;一般来说&#xff0c;producer 将消息投递到 broker 或直接到queue 里了&#xff0c;consumer 从 queue 取出消息进…

分布式微服务系统架构第87集:kafka

Kafka 就是为了解决上述问题而设计的一款基于发布与订阅的消息系统。它一般被称为 “分布式提交日志”或者“分布式流平台”。文件系统或数据库提交日志用来提供所有事务 的持久记录&#xff0c;通过重放这些日志可以重建系统的状态。同样地&#xff0c;Kafka 的数据是按照一定…

WebForms SortedList 深度解析

WebForms SortedList 深度解析 引言 在Web开发领域,对于数据结构的理解与应用至关重要。其中,SortedList类在WebForms中是一个常用的数据结构,它能够帮助开发者高效地管理有序数据集合。本文将深入解析SortedList类在WebForms中的应用,包括其基本概念、常用方法、性能特点…

javaEE-7.网络原理-HTTPS

目录 1.概念: 2.加密形式 3.HTTPS工作流程 1).引入对称加密 2).引入非对称加密 1.概念: https是http的加密版. HTTPS : HTTP SSL(加密) HTTP属于明文传输,在传输过程中,可能会存在一定的风险,HTTPS对传输的内容进行了加密处理. HTTPS除了对内容进行密文传输,别的和HTTP是…

MATLAB中fetchOutputs函数用法

目录 语法 说明 示例 在后台运行函数 fetchOutputs函数的功能是从在后台运行的函数中检索结果。 语法 [Y1,...,Ym] fetchOutputs(F) [Y1,...,Ym] fetchOutputs(F,UniformOutputfalse) 说明 [Y1, ..., Ym] fetchOutputs(F) 从 Future 数组 F 中检索出 m 个结果。 F 中…