使用rust abi调用库函数

使用rust abi调用库函数,rust,ld,ffi,Rust,Ld,Ffi,我有两个板条箱X和Y。第一个板条箱管理低级材料并定义入口点。然后它应该将控制权转移到Y,Y执行高级逻辑。我想在X中显式声明Y的函数并调用它(因此链接器在构建Y-crater时连接这些函数) 我知道Rust有不稳定的ABI,但我在同一个编译器的工作区中使用了这两个板条箱 我尝试了以下示例,但链接器找不到real\u main(未定义的引用…): //X的main.rs #[link(name=“y\u lib\u name”,link=“static”)] 外部“生锈”{ fn real_main

我有两个板条箱X和Y。第一个板条箱管理低级材料并定义入口点。然后它应该将控制权转移到Y,Y执行高级逻辑。我想在X中显式声明Y的函数并调用它(因此链接器在构建Y-crater时连接这些函数)

我知道Rust有不稳定的ABI,但我在同一个编译器的工作区中使用了这两个板条箱

我尝试了以下示例,但链接器找不到
real\u main
(未定义的引用…):

//X的main.rs
#[link(name=“y\u lib\u name”,link=“static”)]
外部“生锈”{
fn real_main();
}
fn main(){
//顺便说一句,这里可以避免不安全吗?
不安全{real_main()}
}
//Y's lib.rs
pub fn real_main(){..}
尽管符号存在:

$nm target/debug/deps/liby_lib_name-8ade2b95fe4044c6.rlib | rg real_main
nm:lib.rmeta:无法识别文件格式
0000000000000000吨锌8Y lib名称9Real\u main17h8664760a5d2676beE
我想我的问题可以通过X中的宏解决,如下所示:

//在X中
#[宏_导出]
宏\u规则定义\u ep!{
($fn:expr)=>{{fn main(){$fn();}}}
}
//在Y
fn f(){}
定义!(f) );
但我更喜欢链接器支持的方式,因为:

  • 若你们忘了链接器,只需给你们一个错误
  • (不确定)如果符号出现不止一次,链接器将给出错误

我想你需要一些像这里一样的东西:嗯,我明白了。但我认为它有一些局限性(例如,泛型用法,对生命周期特别有用),对吗?遗憾的是,我不是这方面的专家,我记得不久前读过这篇文章。泛型是单态的,所以它不应该成为问题?我想你需要一些#[no#mangle]比如这里:嗯,我明白了。但我认为它有一些局限性(例如,泛型用法,对生命周期特别有用),对吗?遗憾的是,我不是这方面的专家,我记得不久前读过这篇文章。泛型是单态的,所以它不应该成为问题?