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.mzph.cn/news/894297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

四、jQuery笔记

(一)jQuery概述 jQuery本身是js的一个轻量级的库,封装了一个对象jQuery,jquery的所有语法都在jQuery对象中 浏览器不认识jquery,只渲染html、css和js代码,需要先导入jQuery文件,官网下载即可 jQuery中文说明文档:https://hemin.cn/jq/ (二)jQuery要点 1、jQuery对象 …

Versal - 基础4(VD100+Versal IBERT)

1. 简介 在之前的一篇博文中&#xff0c;我分享了在 Zynq Ultrascale MPSoC 中使用 IBERT 的方法。 《Vivado - 集成眼图分析仪 Serial I/O IBERT 误码率_vivado ibert-CSDN博客》 本文进一步探讨 Versal 中使用 IBERT 的方法。 2. 硬件平台 芯片&#xff1a;XCVE2302-SF…

《HelloGitHub》第 106 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…

英语语法 第一天

I’m a student. 我是个学生 我是个新东方的学生 I’m a student of New Oriental School 我爱你 I love you 我在心中爱你 I love you in my heart. 这是一朵花 This is a flower 这是一朵在公园里的花 This is a flower in the park.(修饰部分在修饰词后面) 主干…

Day50:字典的合并

在 Python 中&#xff0c;字典是一个可变的数据类型&#xff0c;经常需要将多个字典合并成一个字典。合并字典的方式有多种&#xff0c;今天我们将学习几种常见的方法。 1. 使用 update() 方法合并字典 update() 方法可以用来将一个字典中的键值对添加到另一个字典中。如果目…

USB鼠标的数据格式

USB鼠标的数据格式由HID&#xff08;Human Interface Device&#xff09;协议定义&#xff0c;通常包含3个字节的标准数据&#xff0c;具体格式如下&#xff1a; 字节内容描述第1字节按键状态Bit 0: 左键按下&#xff08;1&#xff09;<br>Bit 1: 右键按下&#xff08;1…

为AI聊天工具添加一个知识系统 之79 详细设计之20 正则表达式 之7

本文要点 要点 “正则表达式” 本来是计算机科学计算机科学的一个概念。本项目将它推广&#xff08;扩张&#xff09;到认知科学的“认知范畴”概念&#xff0c; 聚合&#xff08;收敛&#xff09;到 神经科学 的“神经元”概念。 做法是&#xff1a;用reg 来系统化定义认知…

Spring RESTful API 设计与实现

Spring RESTful API的设计与实现极大地提升了开发效率和系统可维护性,通过遵循RESTful设计原则,使得API结构清晰、行为一致,便于扩展和维护。它在构建微服务架构中扮演着核心角色,支持松耦合的通信,同时通过标准的HTTP协议和数据格式增强了系统的互操作性。结合Spring Sec…

“新月之智”智能战术头盔系统(CITHS)

新月人物传记&#xff1a;人物传记之新月篇-CSDN博客 相关文章链接&#xff08;更新&#xff09;&#xff1a; 星际战争模拟系统&#xff1a;新月的编程之道-CSDN博客 新月智能护甲系统CMIA--未来战场的守护者-CSDN博客 目录 一、引言 二、智能头盔控制系统概述 三、系统架…

猿人学web 19题(js逆向)

这题直接点击翻页抓包&#xff0c;然后获取seesion ID请求即可 求和代码 import requestssession requests.Session() cookies {sessionid:eao9i00r8pt4xu6uzzx2k01ttqn51yc9} urlhttps://match.yuanrenxue.cn/api/match/19?page sum0 for i in range(1,6):response sess…

c语言:编译和链接(详解)

前言 要将编译和链接&#xff0c;就不得不提及编译器是如何运作的&#xff0c;虽然这部分知识是针对于要创造编译器和创作语言的人所需要清楚的&#xff0c;但作为c语言的学习者也需要了解一下&#xff0c;修炼内功&#xff0c;尤其是对于想学习c的人而言。 编译器的运作过程…

如何解决Unit sshd.service could not be found

出现 Unit sshd.service could not be found 错误时&#xff0c;通常是因为系统中未安装 OpenSSH 服务、服务名称不匹配或系统未使用 systemd 管理服务。以下是详细的解决方案&#xff1a; 一、确认 SSH 服务是否安装 1. 检查是否已安装 OpenSSH 服务器 不同 Linux 发行版的包…

积分和微分的区别

积分&#xff1a; 积分是由微小量求大量&#xff0c;由微观的数据求得整体的状况。运算是对总量求和。 微分&#xff1a; 微分是由大量求微小量&#xff0c;反应微观的状况&#xff0c;运算是伴随着求导。 峰值检测电路: 上图检测的误差主要来自与二极管的正向导通电压降&am…

OVS-DPDK

dpdk介绍及应用 DPDK介绍 DPDK&#xff08;Data Plane Development Kit&#xff09;是一组快速处理数据包的开发平台及接口。有intel主导开发&#xff0c;主要基于Linux系统&#xff0c;用于快速数据包处理的函 数库与驱动集合&#xff0c;可以极大提高数据处理性能和吞吐量&…

【Go语言圣经】第六节:方法

第六章&#xff1a;方法 6.1 方法声明 在函数声明时&#xff0c;在其名字之前放上一个变量&#xff0c;这就是声明了变量对应类型的一个方法&#xff0c;相当于为这种类型定义了一个独占的方法。 下例为 Point 类型声明了计算两个点之间距离的方法&#xff1a; package mai…

matlab的.mat文件怎么把表格中的值全部设置为空

在MATLAB中&#xff0c;如果您想要将.mat文件中的表格&#xff08;table&#xff09;中的所有值设置为空&#xff0c;您可以先加载该.mat文件&#xff0c;然后修改表格中的数据&#xff0c;最后保存修改后的表格。以下是一个具体的步骤示例&#xff1a; 加载.mat文件&#xff1…

亚博microros小车-原生ubuntu支持系列:18 Cartographer建图

Cartographer简介 Cartographer是Google开源的一个ROS系统支持的2D和3D SLAM&#xff08;simultaneous localization and mapping&#xff09;库。基于图优化&#xff08;多线程后端优化、cere构建的problem优化&#xff09;的方法建图算法。可以结合来自多个传感器&#xff0…

安卓(android)实现注册界面【Android移动开发基础案例教程(第2版)黑马程序员】

一、实验目的&#xff08;如果代码有错漏&#xff0c;可查看源码&#xff09; 1.掌握LinearLayout、RelativeLayout、FrameLayout等布局的综合使用。 2.掌握ImageView、TextView、EditText、CheckBox、Button、RadioGroup、RadioButton、ListView、RecyclerView等控件在项目中的…

Java进阶six junit单元测试,反射,注解,动态代理

前言 Java进阶课程的第六篇&#xff0c;也是最后一篇&#xff0c;junit单元测试,反射,注解,动态代理相关内容 包含知识点 junit单元测试 反射 1.内部类Student&#xff1a; 包含私有/公共字段和方法 包含默认构造器和私有构造器 2.获取Class对象的三种方式&#xff1a; .…

程序代码篇---Python随机数

文章目录 前言Python随机数函数random.random()random.randint(a,b)random.randrange(start,stop[,step])random.uniform(a,b)random.choice(sequence)random.sample(population,k)random.shuffle(x[,random])random.seed(aNone) 总结 前言 以上就是今天要讲的内容&#xff0c…