如何找出哪个 Rust 依赖项添加了动态链接库

2023-12-25

我有一个相当大的项目,有很多依赖项。我希望生成的二进制文件使用尽可能少的动态链接库。我刚刚检查了生成的二进制文件并看到:

$ ldd target/debug/foo
libssl.so.1.1 => /lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007f1f2100e000)
...

我不知道为什么我的二进制文件动态链接到libssl,所以我想调查一下。我知道添加这些链接的 Rust 箱需要打印一些特殊的行 https://doc.rust-lang.org/cargo/reference/build-scripts.html#outputs-of-the-build-script在他们的构建脚本中。但现在我迷失了:我如何轻松地找出数百个间接依赖项(即 Rust 箱)中的哪一个添加了此动态链接?有没有好的通用解决方案?


我不确定是否有更好的方法,但这对我有用:

cargo clean && cargo build -vv 2>/dev/null | grep 'rustc-link-lib'

一些解释:

  • 我们感兴趣的是构建脚本的输出 https://doc.rust-lang.org/cargo/reference/build-scripts.html#outputs-of-the-build-script所有依赖项。
  • cargo clean:强制重新执行所有构建脚本。
  • cargo build -vv:显示构建脚本的输出。
  • 2>/dev/null: 忽略 stderrcargo build(不然很吵)
  • grep:过滤相关行。

该命令应该产生如下输出:

[libz-sys 1.1.8] cargo:rustc-link-lib=z
[openssl-sys 0.9.75] cargo:rustc-link-lib=ssl
[openssl-sys 0.9.75] cargo:rustc-link-lib=crypto

请注意,并非所有打印行都必须是到库的动态链接(例如,有rustc-link-lib=static=...).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何找出哪个 Rust 依赖项添加了动态链接库 的相关文章

随机推荐