从 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

    }
}