在dylib中调用外部函数

Call external function in dylib

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

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

example.dylib dyliib 加载成功,调用 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();
}

但这甚至无法编译:

Undefined symbols for architecture x86_64:
    "_fn_in_main_app", referenced from:

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

Dylib 不能依赖加载它们的应用程序。 dylib 依赖图必须是完全线性的,不允许循环依赖。根据您正在做的事情,可以将 fn_in_main_app 移动到 dylib 的上游依赖项。您还可以将函数指针传递给 dylib:

pub extern "Rust" fn fn_in_dylib(fn_in_main_app: fn()) {
    (fn_in_main_app)();
}