如果我使用Cargo和一些 crate 依赖项构建一个Rust应用程序,那么这些依赖项中我的应用程序未使用的任何代码会从最终可执行文件中删除吗?
如果我使用Cargo和一些 crate 依赖项构建一个Rust应用程序,那么这些依赖项中我的应用程序未使用的任何代码会从最终可执行文件中删除吗?
看起来是这样.我做了一个并排的测试库和箱子:
// 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
0000000100001360 t __ZN10helloworld4main17h749f61fb726f0a10E
00000001000014b0 T __ZN8hellolib5func117hec0b5301559d46f6E
只有使用过的函数在最终二进制中有一个符号.
但是,您可以使用cargo rustc -- -C link-dead-code
进行编译,您将看到两个符号都存在,包括未使用的符号:
$ nm target/debug/helloworld | grep hello
0000000100001270 t __ZN10helloworld4main17h3104b73b00fdd798E
00000001000013d0 T __ZN8hellolib5func117hec0b5301559d46f6E
0000000100001420 T __ZN8hellolib5func217hc9d0886874057b84E
我相信(但我不确定)是链接器删除了死代码,所以它可能仍然被编译,然后在链接过程中被删除.