我的目标是创建在需要用户提供的存储器块具有一定尺寸的C API。这个尺寸正好是我的防锈库结构的大小,所以我想提取防锈结构的大小,并将其放置在头文件作为一个C宏。
问题是,我交叉编译我的图书馆,所以我不能运行我的计算机上的程序,打印core::mem::size_of::<MyStruct>()
。但我可以说值存储在我的图书馆const
变量。
有没有什么方法来提取代表我的结构的大小在编译的时候,这样我就可以将其粘贴到C头文件这个const
变量的值?
绝对不这样做:
#[no_mangle]
pub fn size_of_mystruct() -> usize {
std::mem::size_of::<MyStruct>()
}
CARGO_INCREMENTAL=0 cargo rustc -- --emit=llvm-ir -o ir
确保添加--target
选项了。这将创建一些文件,其中一个应该有扩展.ll
。该CARGO_INCREMENTAL=0
是很重要的 - 没有它,它会创造大量的.ll
文件,谁知道这是正确的!打开文件,然后搜索size_of_mystruct
。你会发现这样的事情:
; Function Attrs: uwtable
define i64 @size_of_mystruct() unnamed_addr #0 !dbg !142 {
start:
; call core::mem::size_of
%0 = call i64 @_ZN4core3mem7size_of17hc5e3caf4d8826b98E(), !dbg !144
br label %bb1, !dbg !144
_ZN4core3mem7size_of17hc5e3caf4d8826b98E
)。它看起来是这样的:
; core::mem::size_of
; Function Attrs: inlinehint uwtable
define internal i64 @_ZN4core3mem7size_of17hc5e3caf4d8826b98E() unnamed_addr #1 !dbg !67 {
start:
%tmp_ret = alloca i64, align 8
store i64 40, i64* %tmp_ret, align 8, !dbg !87
%0 = load i64, i64* %tmp_ret, align 8, !dbg !87
br label %bb1, !dbg !87
store i64 40
。该结构是40个字节!