我使用 cargo new a
创建了一个全新的板条箱,并在 src/lib.rs
中输入了以下内容:
pub fn xor(a: i32, b: i32) -> i32 {
a ^ b
}
#[inline]
pub fn xor_inline(a: i32, b: i32) -> i32 {
a ^ b
}
当我使用cargo build --release
进行编译时,生成的.rlib
只包含xor
而不包括xor_inline
:
$ gnm -D -C target/release/deps/liba-6a3c2798185fafee.rlib
gnm: __.SYMDEF: File format not recognized
a-6a3c2798185fafee.0.o:
0000000000000000 T a::xor::hf0d97103d53d3286
gnm: rust.metadata.bin: File format not recognized
gnm: a-6a3c2798185fafee.0.bytecode.deflate: File format not recognized
(gnm
是通过Homebrew在MacOS上安装的GNU nm
。)
我有两个问题:
为什么
xor_inline
不在目标文件中?我认为它的源代码必须存在于rust.metadata.bin
中,以便跨crate内联起作用,但为什么普通函数没有从目标文件中导出?是否有任何
rustc
标志可以与cargo rustc --release -- ...
一起使用,以确保所有#[inline]
函数都在目标文件中?(也许是不同的--crate-type
或-C
下的标志之一?)
(我需要这样做是因为我想检查我的crate中函数生成的汇编代码,而不必删除所有内联属性或将每个内联函数包装在公共非内联函数中。)