gpt4 book ai didi

rust - 使用来自 Rust 动态库的损坏的 Rust 函数

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

编辑备注

由于 Rust(版本:1.42)仍然没有稳定的 ABI ,推荐使用extern (目前相当于extern "C"(将来可能会改变))否则,可能需要重新编译库。

This article解释如何更改 calling convention .

目标是能够在使用该库的 crate 中使用重命名的函数(这将允许来自具有相同标识符的不同模块/命名空间的函数共存)。

我注意到 Rust (ver.: 1.42) 自动假定导出函数的函数标识符是 不是 被破坏。

目前我可以成功链接它并在使用#[no_mangle]时使用它和 #[export_name="..."]在功能上。

我正在使用 stable-x86_64-windows-pc-msvc工具链。

工作示例

rslib/lib.rs:

#[no_mangle] /* Exports it as "func" */
pub extern fn func() { ... }

应用程序/main.rs:

#[link(name="rslib.dll", kind="dylib")]
extern { fn func(); }

fn main() {
unsafe { func(); }
}

这编译并运行没有问题。

不工作的例子

rslib/lib.rs:
pub extern fn func() { ... }

使用相同的“app/main.rs”会导致链接失败: error LNK2019: unresolved external symbol __imp_func referenced in function _ZN8rust_app4main17h52189e261ef80b93E .

最佳答案

手动解决方案

我想出的解决方案是手动放置#[link_name="..."] extern 中的函数堵塞。这样,也可以拥有使用导入函数的模块。

注意:可以用宏来完成!

rslib/lib.rs:

pub mod foo {
#[export_name="foo_func"] /* Also possible to append some identification for different parameters if desired */
pub extern fn func() { ... }
}

#[export_name="func"]
pub extern fn func() { ... }

应用程序/main.rs:

mod foo {
#[link(name="rslib.dll", kind="dylib")]
extern {
#[link_name="foo_func"]
pub fn func();
}
}

#[link(name="rslib.dll", kind="dylib")]
extern {
#[link_name="_func"]
pub fn func();
}

fn main() {
unsafe {
func();
foo::func();
}
}

关于rust - 使用来自 Rust 动态库的损坏的 Rust 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60760545/

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