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