gpt4 book ai didi

dll - 如何在共享库中动态调用函数?

转载 作者:行者123 更新时间:2023-12-03 11:41:27 27 4
gpt4 key购买 nike

我有一个Rust项目,设置为可执行文件。我试图动态地调用同样用Rust编写的外部共享库。我已经在发行版上编译了外部库,并且尝试了两种 crate 类型cdylibdylib
我正在使用 crate libloading,声称它可以动态加载共享库函数,只要它们仅使用原始参数即可。当我尝试使用此 crate 运行代码时,我不断收到此错误。

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: GetProcAddress { source: Os { code: 127, kind: Other, message: "The specified procedure could not be found." } }', src\main.rs:14:68
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

main.rs/main():
    let now = Instant::now();

unsafe {
let lib = libloading::Library::new(
"externtest.dll").unwrap();
let foo3: Symbol<extern fn(i32) -> i32> = lib.get(b"foo").unwrap();

println!("{}", foo(1));
}

let elapsed = now.elapsed();
println!("Elapsed: {:?}", elapsed);
lib.rs:
pub extern "C" fn foo3(i:i32) -> i32{
i
}

最佳答案

首先,您的库函数称为"foo3",但是您正在尝试加载符号"foo"
其次,由于重整,库函数的符号可能与名称不匹配。您需要通过 #[no_mangle] 属性告诉编译器不要这样做:

#[no_mangle]
pub extern "C" fn foo(i: i32) -> i32 {
i
}
第三,这主要是一种风格选择,但是在定义您的符号时,我将指定ABI extern "C"。即使使用 extern with no epecified ABI uses the "C" ABI,我也发现明确一点更好。
use libloading::{Library, Symbol};

fn main() {
unsafe {
let lib = Library::new("externtest.dll").unwrap();
let foo = lib
.get::<Symbol<extern "C" fn(i32) -> i32>>(b"foo")
.unwrap();

println!("{}", foo(1));
}
}
以上应该没有问题。

关于dll - 如何在共享库中动态调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66252029/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com