调用dylib中的外部函数

Ura*_*aty 2 dylib rust

我的主要应用程序的代码如下所示:

pub fn load_lib() {
    let dylib = libloading::Library::new("example.dylib") ...
    unsafe { *dylib.get(b"fn_in_dylib") } ...
    // calling function from dylib.
}
pub extern "Rust" fn fn_in_main_app() { ... } // Function that I want to call from dylib
Run Code Online (Sandbox Code Playgroud)

example.dylibdyliib 已成功加载,并且调用 dylib 中的函数没有任何问题。

但这是我在 dylib 中尝试做的事情:

pub extern "Rust" fn fn_in_dylib() {
    fn_in_main_app(); // Here I'm trying to call function defined in main application.
}
extern "Rust" {
    fn fn_in_main_app();
}
Run Code Online (Sandbox Code Playgroud)

但这甚至无法编译:

Undefined symbols for architecture x86_64:
    "_fn_in_main_app", referenced from:
Run Code Online (Sandbox Code Playgroud)

我不确定我是否使用正确的方法来实现这一点,所以当它没有编译时我并不感到惊讶。但我希望它能展示出我真正想要做的事情。

Kai*_*aiJ 6

Dylib 不能依赖于加载它们的应用程序。dylib 依赖关系图必须是完全线性的,不允许循环依赖关系。根据您正在执行的操作,可能会移动fn_in_main_app到 dylib 的上游依赖项。您还可以传递一个指向 dylib 的函数指针:

pub extern "Rust" fn fn_in_dylib(fn_in_main_app: fn()) {
    (fn_in_main_app)();
}
Run Code Online (Sandbox Code Playgroud)