Я хотел бы определить черту с именем API
, которая определяет набор функций, которые должны быть доступны для native. У меня может быть несколько реализаций API, поэтому эта черта гарантирует, что я по ошибке не пропущу функцию из набора.
Я объявил черту и реализовал ее:
pub trait API {
extern "C" fn foo();
}
pub struct MyImpl1;
impl API for MyImpl1 {
#[no_mangle]
extern "C" fn foo() {
println!("foo");
}
}
Я компилирую ящик как cdylib
с cargo build
. Cargo.toml
выглядит следующим образом:
[package]
name = "api-trait"
version = "0.1.0"
edition = "2018"
[lib]
crate-type = ["cdylib"]
Кажется, что даже когда я делаю MyImpl1
publi c, символ foo
не существует в сгенерированном двоичном файле.
На macOS, используя nm target/debug/libapi_trait.dylib
, я получил
0000000000000f64 s GCC_except_table10
U __Unwind_GetDataRelBase
U __Unwind_GetIPInfo
U __Unwind_GetLanguageSpecificData
U __Unwind_GetRegionStart
U __Unwind_GetTextRelBase
U __Unwind_SetGR
U __Unwind_SetIP
0000000000000ec0 t __ZN12panic_unwind3imp14find_eh_action28_$u7b$$u7b$closure$u7d$$u7d$17h882730ec655d7cb8E
0000000000000ed0 t __ZN12panic_unwind3imp14find_eh_action28_$u7b$$u7b$closure$u7d$$u7d$17hf5c37156294234d5E
0000000000000a10 t __ZN12panic_unwind5dwarf2eh20read_encoded_pointer17h9109e27fb696b750E
00000000000009e0 t __ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h1282dc016f2aa15fE
00000000000009f0 t __ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h6c6c5197d1b45824E
0000000000000a00 t __ZN4core3ptr18real_drop_in_place17ha0a3e8a3d7a638afE
0000000000002038 d __dyld_private
0000000000000bd0 T _rust_eh_personality
U dyld_stub_binder
На Linux, используя nm target/debug/libapi_trait.so
, я получаю
0000000000202008 b __bss_start
0000000000202008 b completed.7697
w __cxa_finalize@@GLIBC_2.2.5
0000000000000710 t deregister_tm_clones
00000000000007a0 t __do_global_dtors_aux
0000000000201d28 t __do_global_dtors_aux_fini_array_entry
0000000000202000 d __dso_handle
0000000000201d90 d _DYNAMIC
0000000000202008 d _edata
0000000000202010 b _end
0000000000000ccc t _fini
00000000000007e0 t frame_dummy
0000000000201d20 t __frame_dummy_init_array_entry
0000000000000ecc r __FRAME_END__
0000000000201f90 d _GLOBAL_OFFSET_TABLE_
w __gmon_start__
0000000000000d30 r __GNU_EH_FRAME_HDR
00000000000006d8 t _init
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
0000000000000750 t register_tm_clones
00000000000009a0 T rust_eh_personality
0000000000202008 d __TMC_END__
U _Unwind_GetDataRelBase@@GCC_3.0
U _Unwind_GetIPInfo@@GCC_4.2.0
U _Unwind_GetLanguageSpecificData@@GCC_3.0
U _Unwind_GetRegionStart@@GCC_3.0
U _Unwind_GetTextRelBase@@GCC_3.0
U _Unwind_SetGR@@GCC_3.0
U _Unwind_SetIP@@GCC_3.0
0000000000000cb0 t _ZN12panic_unwind3imp14find_eh_action28_$u7b$$u7b$closure$u7d$$u7d$17h7d8572c3ef9c01a4E
0000000000000cc0 t _ZN12panic_unwind3imp14find_eh_action28_$u7b$$u7b$closure$u7d$$u7d$17h8f3ed794c49a4682E
0000000000000820 t _ZN12panic_unwind5dwarf2eh20read_encoded_pointer17he5d3453b5c6c588aE
00000000000007f0 t _ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h91ae32eaf5f323cfE
0000000000000800 t _ZN4core3ops8function6FnOnce40call_once$u7b$$u7b$vtable.shim$u7d$$u7d$17h95ce8da4c283a783E
0000000000000810 t _ZN4core3ptr18real_drop_in_place17h02c8363f4a3e6833E
foo
делает не существует ни в одном. Что я пропустил?