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

Luk*_*odt 3 dynamic-linking rust

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

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

我不知道为什么我的二进制文件动态链接到libssl,所以我想调查一下。我知道添加这些链接的 Rust 箱需要在其构建脚本中打印一些特殊行。但现在我迷失了:我如何轻松地找出数百个间接依赖项(即 Rust 板条箱)中的哪一个添加了此动态链接?有没有好的通用解决方案?

Luk*_*odt 6

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

cargo clean && cargo build -vv 2>/dev/null | grep 'rustc-link-lib'
Run Code Online (Sandbox Code Playgroud)

一些解释:

  • 我们对所有依赖项的构建脚本的输出感兴趣。
  • cargo clean:强制重新执行所有构建脚本。
  • cargo build -vv:显示构建脚本的输出。
  • 2>/dev/null: 忽略 stderr of cargo 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
Run Code Online (Sandbox Code Playgroud)

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