使用rust abi调用库函数
我有两个板条箱X和Y。第一个板条箱管理低级材料并定义入口点。然后它应该将控制权转移到Y,Y执行高级逻辑。我想在X中显式声明Y的函数并调用它(因此链接器在构建Y-crater时连接这些函数) 我知道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
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) );
但我更喜欢链接器支持的方式,因为:
- 若你们忘了链接器,只需给你们一个错误李>
- (不确定)如果符号出现不止一次,链接器将给出错误