rust跨平台调用动态库

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

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,实测方案可行。

相关推荐
桦说编程6 小时前
并发编程中的等待-通知模式:从 wait/notify 到 Guava Monitor
后端
hsjiasb6 小时前
FreeRTOS学习(二十七)——任务栈与栈溢出检测
开发语言·stm32·学习·学习笔记·freertos
丰锋ff6 小时前
3.1 Qt事件之事件处理器
开发语言·qt
多弗朗皮卡丘7 小时前
C语言梦开始的地方7:函数
c语言·开发语言
月华路7 小时前
G1 垃圾回收:脏卡队列、记忆集与并发精化线程机制
java·开发语言
用户938515635077 小时前
工厂模式与 Nest.js 核心思想 —— 从蜜雪冰城到企业级架构
后端·设计模式·nestjs
用户938515635077 小时前
实战 Todo CRUD —— 从路由到异常,手写一个完整模块
后端·typescript·nestjs
gugucoding8 小时前
47. 【Java】Java内存模型(JMM)与可见性
java·开发语言
m0_380743878 小时前
从零调用 Claude 教程
开发语言·python·node.js
GetcharZp8 小时前
Qdrant 向量数据库 Golang 实战指南:从零构建高性能检索应用
后端