如果我使用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

我相信(但我不确定)是链接器删除了死代码,所以它可能仍然被编译,然后在链接过程中被删除.

Rust相关问答推荐

MutexGuard中的过滤载体不需要克隆

用 rust 蚀中的future 展望 struct 的future

如何设置activx websocket actorless的消息大小限制?

为什么不';t(&;mut-iter).take(n)取得iter的所有权?

Rust 中的复合 `HashSet` 操作或如何在 Rust 中获得 `HashSet` 的显式差异/并集

如何使用tracing-subscriberRust crate 构建多编写者、全局过滤订阅者

在 Rust 中查找向量中 dyn struct 的索引

sha256 摘要仅适用于 &*

Button.set_hexpand(false) 不会阻止按钮展开

当在lambda中通过引用传递时,为什么会出现终身/类型不匹配错误?

使用 Rust 从 Raspberry Pi Pico 上的 SPI 读取值

push 方法是否取得所有权?

为什么我可以同时传递可变和不可变引用?

通用函数中的生命周期扣除和borrow (通用测试需要)

如何在 nom 中构建负前瞻解析器?

使用 `.` 将 T 转换为 &mut T?

为什么 std::iter::Peekable::peek 可变地borrow self 参数?

如何在 Rust 的内置函数上实现特征?

为什么 u64::trailing_zeros() 在无分支工作时生成分支程序集?

为什么一个整型变量赋值给另一个变量后仍然可以使用?