编辑注释
由于 Rust(版本:1.42)仍然没有稳定的 ABI ,建议使用extern
(目前相当于extern "C"
(将来可能会改变)),否则可能需要重新编译库。
This article解释如何更改 calling convention .
目标是能够在使用该库的包内使用名称困惑的函数(这将允许来自具有相同标识符的不同模块/命名空间的函数共存)。
我注意到 Rust(版本: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() { ... }
app/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”会导致链接失败,并显示:
错误 LNK2019:函数 _ZN8rust_app4main17h52189e261ef80b93E 中引用了无法解析的外部符号 __imp_func
。
最佳答案
手动解决方案
我提出的解决方案是手动将 #[link_name="..."]
放在 extern
block 中的函数上。这样,也可以有使用导入函数的模块。
注意:可以使用宏来完成!
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() { ... }
app/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/