Rust 编译的可执行文件是否从依赖项中排除未使用的代码?
如果我使用Cargo和一些板条箱依赖项构建一个Rust应用程序,那么这些依赖项中我的应用程序未使用的任何代码是否会从最终可执行文件中删除?看起来像这样。我做了一个并排的测试库和箱子:Rust 编译的可执行文件是否从依赖项中排除未使用的代码?,rust,dependencies,rust-cargo,Rust,Dependencies,Rust Cargo,如果我使用Cargo和一些板条箱依赖项构建一个Rust应用程序,那么这些依赖项中我的应用程序未使用的任何代码是否会从最终可执行文件中删除?看起来像这样。我做了一个并排的测试库和箱子: // hellobin/src/main.rs extern crate hellolib; fn main() { hellolib::func1(); } 对于lib: // hellolib/src/main.rs pub fn func1() { println!("Hello, w
// hellobin/src/main.rs
extern crate hellolib;
fn main() {
hellolib::func1();
}
对于lib:
// hellolib/src/main.rs
pub fn func1() {
println!("Hello, world!");
}
pub fn func2() {
println!("Hello, other world!");
}
构建二进制文件,然后使用nm
检查符号:
$nm target/debug/helloworld | grep hello
0000000 10000360吨锌10HelloWorld4Main17H749F61FB726F0A10E
0000000 1000014B0 T_u_zn8;hELLOLIB5FUNC117HEC0B5301559D46F6E
只有使用过的函数在最终二进制中有一个符号
但是,您可以使用C--C链接死代码编译,您将看到两个符号都存在,包括未使用的符号:
$nm target/debug/helloworld | grep hello
0000000 10000170吨锌10HELLOWORLD4MAIN17H3104B73B00FDD798E
0000000 100001d0 T_uuuzn8hellolib5func117HEC0b5301559D46F6E
0000000 100001420 T_uuuZn8钻井液功能217HC9D0886874057B84E
我相信(但我不确定)是链接器删除了死代码,因此它可能仍然被编译,然后在链接过程中被删除。TL;DR:是的,所有未使用的功能都将被排除在外
这实际上是LLVM的工作,它至少会跟踪每个未使用的函数。任何未使用的代码(如未在整个应用程序中使用的函数中的代码路径)都可能需要激活LTO(链接时间优化),以将您的板条箱变成一个编译单元,并给LLVM一个战斗机会。我认为是的,但我不确定。我可能会检查objdump或类似的东西,但我想看看是否有一个明确的答案,或者是否计划在未来发布。hello world类型可执行文件的大小有一个相关的问题。肯定有LTO,否则我就没有那么确定了。尼斯:)我会接受这个答案,除非有人从rust文档/项目中提出了明确的答案。我编辑了答案,以澄清tl;dr yes
特别指未使用的功能。