从 Rust 中的另一个 DLL 中的 DLL 访问静态固定大小数组的元素
Access elements of a static fixed size array from a DLL in another DLL in Rust
我正在将对象的一些信息编译成 .so
,例如:
#[no_mangle]
pub static a: [f32; 10] = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0];
(当然是简化版)
我需要从另一个 .so
访问它的值并考虑简化过程,而不是创建一个 return 是 Vec<f32>
的函数,例如,我想return 一个固定大小的数组,因为这不会改变,例如:
use libloading::{Library, Symbol};
...
unsafe {
let lib = Library::new("path/to/lib.so").unwrap();
let a: Symbol< * mut [f32; 10] > = lib.get(b"a[=11=]").unwrap();
println!("{:?}", **a); // To check what is being retrieved
}
...
到目前为止打印的输出是:
[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
这是正确的,但我无法访问它的元素,例如:
let b = a[0];
编译时:
error[E0608]: cannot index into a value of type `libloading::Symbol<'_, *mut [f32; 10]>`
如何访问值,甚至将整个数组分配给调用者中的一个新数组 .so
?
如果你想访问元素,你必须首先取消引用 Symbol
和可变指针,就像你在打印完整数组时已经正确做的那样。
因此,如果您只想访问第一个元素,则必须使用 (**a)[0]
或 (**a)[7]
(如果您想检索第八个元素)。
这是基于您问题中的代码的完整示例:
use libloading::{Library, Symbol};
fn main() {
unsafe {
let lib = Library::new("libarray_lib.dylib").unwrap();
let a: Symbol< * mut [f32; 10] > = lib.get(b"a[=10=]").unwrap();
println!("{:?}", **a); // To check what is being retrieved
println!("{}", (**a)[0]); // Dereference a and access its first element
}
}
我正在将对象的一些信息编译成 .so
,例如:
#[no_mangle]
pub static a: [f32; 10] = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0];
(当然是简化版)
我需要从另一个 .so
访问它的值并考虑简化过程,而不是创建一个 return 是 Vec<f32>
的函数,例如,我想return 一个固定大小的数组,因为这不会改变,例如:
use libloading::{Library, Symbol};
...
unsafe {
let lib = Library::new("path/to/lib.so").unwrap();
let a: Symbol< * mut [f32; 10] > = lib.get(b"a[=11=]").unwrap();
println!("{:?}", **a); // To check what is being retrieved
}
...
到目前为止打印的输出是:
[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
这是正确的,但我无法访问它的元素,例如:
let b = a[0];
编译时:
error[E0608]: cannot index into a value of type `libloading::Symbol<'_, *mut [f32; 10]>`
如何访问值,甚至将整个数组分配给调用者中的一个新数组 .so
?
如果你想访问元素,你必须首先取消引用 Symbol
和可变指针,就像你在打印完整数组时已经正确做的那样。
因此,如果您只想访问第一个元素,则必须使用 (**a)[0]
或 (**a)[7]
(如果您想检索第八个元素)。
这是基于您问题中的代码的完整示例:
use libloading::{Library, Symbol};
fn main() {
unsafe {
let lib = Library::new("libarray_lib.dylib").unwrap();
let a: Symbol< * mut [f32; 10] > = lib.get(b"a[=10=]").unwrap();
println!("{:?}", **a); // To check what is being retrieved
println!("{}", (**a)[0]); // Dereference a and access its first element
}
}