Rust 如何在cdylib中将trait函数公开为外部函数?

Rust 如何在cdylib中将trait函数公开为外部函数?,rust,ffi,Rust,Ffi,我想定义一个名为API的特性,它定义了一组应该向本机公开的函数。我可能有几个API的实现,所以这个特性确保我不会错误地错过集合中的一个函数 我宣布了这一特点并付诸实施: pub-trait-API{ 外部“C”fn foo(); } pub结构MyImpl1; MyImpl1的impl API{ #[没有损坏] 外部“C”fn foo(){ println!(“foo”); } } 我使用货物构建将板条箱编译为cdylib。货物.toml的Cargo.toml如下所示: [package] n

我想定义一个名为
API
的特性,它定义了一组应该向本机公开的函数。我可能有几个API的实现,所以这个特性确保我不会错误地错过集合中的一个函数

我宣布了这一特点并付诸实施:

pub-trait-API{
外部“C”fn foo();
}
pub结构MyImpl1;
MyImpl1的impl API{
#[没有损坏]
外部“C”fn foo(){
println!(“foo”);
}
}
我使用
货物构建将板条箱编译为
cdylib
。货物.toml的
Cargo.toml
如下所示:

[package]
name = "api-trait"
version = "0.1.0"
edition = "2018"

[lib]
crate-type = ["cdylib"]
似乎即使我将
MyImpl1
公开,符号
foo
也不存在于生成的二进制文件中

在macOS上,使用
nmtarget/debug/libapi\u trait.dylib
,我得到了

0000000000000 F64 s GCC\u表10除外
U\U\U展开\U GetDataRelBase
你uu U放松U GetIPInfo
U\U\U展开\U获取语言特定数据
U\U\U放松\U获取区域开始
U____展开_GetExtrelbase
U_uu_U展开_U设置
U_uu_U展开_U设置
0000000000000EC0T\uuuuu zn12恐慌解除3IMP14发现行动\uu7b$$u7b$$u7b$$u7d$$u7d$17h882730ec655d7cb8E
0000000000000ED0T\uuuuu zn12恐慌解除3影响14发现行动28\u7b$$u7b$$u7d$$u7d$17HF5C3715629424D5E
0000000000000 A10 t ZN12panic 5DWARF2EH20READ编码指针17H9109E27FB696B750E
0000000000000 9E0 t_u2;u zn4core3ops8function6fnoce40调用一次$u7b$$u7b$vtable。垫片$u7d$$u7d$17h1282dc016f2aa15fE
0000000000000 9F0 t_u2;u zn4core3ops8function6fnoce40call_0;u一次$u7b$$u7b$vtable。垫片$u7d$$u7d$17h6c6197d1b45824e
0000000000000 A00吨Zn4Core3ptr18实际放置位置HA0A3E8A3D7A638 AFE
0000000000002038 d_uuuuudyld_uprivate
0000000000000 BD0吨生锈
活页夹
在Linux上,使用
nmtarget/debug/libapi\u trait.so
,我得到

0000000000 202008 b\u bss\u启动
0000000000 202008 b已完成。7697
w_uucxa_finalize@@GLIBC_2.2.5
0000000000000 710吨撤销注册
0000000000000 7A0 t\uuuu do\uu global\uu dtors\ux
0000000000 201D28 t\uuu do\u全局\u数据器\u辅助完成数组\u条目
0000000000 202000 d\u dso\u手柄
0000000000 201D90 d_动态
0000000000 202008 d_edata
0000000000 202010 b_完
0000000000000 CCC t_fini
0000000000000 7E0 t帧虚拟
0000000000 201D20 t\u帧\u伪\u初始\u数组\u条目
0000000000000 ECC r\u帧\u结束__
0000000000 201F90 d_全局_偏移表_
w____gmon_启动__
0000000000000 D30 r\u GNU\u EH\u帧\u HDR
0000000000000 6D8 t_init
w_ITM_注销可克隆
w_ITM_寄存器克隆表
0000000000000 750T寄存器\u tm\u克隆
0000000000000 9100 T生锈
0000000000 202008 d_uuTMC_u结束__
U\U展开\U GetDataRelBase@@GCC\U 3.0
U_Unwind\U GetIPInfo@@GCC\U 4.2.0
U\U展开\U获取语言特定数据@@GCC\U 3.0
U\U展开\U GetRegionStart@@GCC\U 3.0
U\U展开\U GetTextElbase@@GCC\U 3.0
U\U展开\U设置GR@@GCC\U 3.0
U\U展开\U设置@@GCC\U 3.0
0000000000000 CB0 t_zn12; 12恐慌_unwind3imp14发现_eh_行动28_$u7b$$u7b$结束$u7d$$u7d$17h7d8572c3ef9c01a4E
0000000000000 CC0 t–ZN12恐慌–解除IMP14发现–eh–行动–u7b$$u7b$结束$u7d$$u7d$17h8f3ed794c49a4682E
0000000000000 820 t_zn12; panic_unwind5dwarf2eh20read_encoded_指针17he5d3453b5c5c588ae
0000000000000 7F0 t_zn4core3ops8function6fnoce40call_一次$u7b$$u7b$vtable。shim$u7d$$u7d$17h91ae32eaf5f323cfE
0000000000000 800吨锌矿石3 OPS8功能6 FNOCE40一次调用$u7b$$u7b$vtable。垫片$u7d$$u7d$17h95ce8da4c283a783E
0000000000000 810吨Zn4Core3ptr18实际放置位置17H02C8363F4A3E6833E

foo
在这两者中都不存在。我错过了什么?

然而,你的计划似乎根本上有缺陷。如果你没有弄乱名称,那么就不可能有多个trait的实现,因为这样你会得到名称冲突…是的,这就解释了区别。我使用的是
dylib
,而不是
cdylib
。由于您提供了
Cargo.toml
,我可以复制粘贴它,而无需在重新键入时输入错误。@Shepmaster是的。使用
dylib
就可以了。我觉得这与我之前提交的这个问题有某种联系。然而,你的计划似乎根本上有缺陷。如果你没有弄乱名称,那么就不可能有多个trait的实现,因为这样你会得到名称冲突…是的,这就解释了区别。我使用的是
dylib
,而不是
cdylib
。由于您提供了
Cargo.toml
,我可以复制粘贴它,而无需在重新键入时输入错误。@Shepmaster是的。使用
dylib
就可以了。我觉得这与我之前提交的这个问题有某种联系。