如何更改默认的 rustc / Cargo 链接器?

How do I change the default rustc / Cargo linker?

我想让 rustc 在特定的 crate 中使用 lld 作为链接器而不是 ld。所以我在我的项目目录中创建了 .cargo/config,如下所示:

[target.x86_64-unknown-linux-gnu]                                                                   
linker = "ld.lld"

这会导致链接器错误:

$ cargo build
...
  = note: ld.lld: error: unable to find library -ldl
          ld.lld: error: unable to find library -lrt
          ld.lld: error: unable to find library -lpthread
          ld.lld: error: unable to find library -lgcc_s
          ld.lld: error: unable to find library -lc
          ld.lld: error: unable to find library -lm
          ld.lld: error: unable to find library -lrt
          ld.lld: error: unable to find library -lpthread
          ld.lld: error: unable to find library -lutil
          ld.lld: error: unable to find library -lutil

rust-lld 相同。如果我设置 linker = "ld"(这应该是默认设置,对吧?),我只会得到

  = note: ld: cannot find -lgcc_s

我试图手动解决所有丢失的库(使用 -C link-arg=--library-path=/usr/lib/x86_64-linux-gnu 等),但它只会导致错误的链接和段错误二进制文件。

有趣的是,如果我将 /usr/bin/ld 替换为 /usr/bin/ld.lld 的符号链接,它会很好用(没有错误,并且从编译的二进制文件中我看到它确实与 lld).但是,我不想让 lld 我的系统范围的链接器,我只想在特定的 Rust crate 中使用它。

那么更改默认 rustc 链接器的正确方法是什么?

感谢@Jmb 的评论,我找到了解决方案。事实证明 rustc 使用的默认 linker 实际上是 cc (这是有道理的 - 它为 compile/link C 代码提供了所有需要的默认值,这也适用于 Rust ).我们可以将参数传递给 cc 使其成为 link 和 lld:

[target.x86_64-unknown-linux-gnu]
rustflags = [
    "-C", "link-arg=-fuse-ld=lld",
]

现在 cargo build link 与 lld

这也行得通,而且我认为 @Jmb 实际是这么问的。

rustflags = [
  "-C", "linker=clang-12",  # change the version as needed
]

将此添加到 Cargo.toml.cargo/config.toml(在项目中)强制使用 lld

[target.x86_64-pc-windows-msvc]
rustflags = ["-C", "link-arg=-fuse-ld=lld"]

[target.x86_64-pc-windows-gnu]
rustflags = ["-C", "link-arg=-fuse-ld=lld"]

[target.x86_64-unknown-linux-gnu]
rustflags = ["-C", "linker=clang", "-C", "link-arg=-fuse-ld=lld"]

有关详细信息,请参阅: https://github.com/rust-lang/rust/issues/71515

如果您安装了 Gcc 9 或更高版本

,您可以在 Linux 上删除 "-C", "linker=clang"