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

标签 rust dynamic-library

编辑注释

由于 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/

相关文章:

rust - 借用检查器和共享 I/O

windows - 在 Windows 上安装 Rust

c++ - 静态对象未在 Mac OS X 上初始化

c++ - 从 C++ 中的动态库访问静态类成员

c++ - 本地动态库

json - 有没有办法快速将 Json<Value> 转换为 bson 以便能够将其保存到 mongo?

Rust:折叠一组元组

rust - 我可以阻止创建或使用类型的引用吗?

c++ - @executable_path 不工作

ada - 厚绑定(bind)动态库: Undefined references