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

38

我希望在特定的箱子中使rustc使用 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"(这应该是默认值,对吗?),那我得到的就是

同样的事情也适用于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创建中使用它。

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


2
如果将clang用作链接器会发生什么? - Jmb
3个回答

38

感谢@Jmb的评论,我找到了解决方案。原来rustc使用的默认链接器实际上是cc(这很合理-它提供了编译/链接C代码所需的所有默认值,也适用于Rust)。我们可以向cc传递一个参数,使其与lld链接:

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

现在cargo build链接使用lld


9
将以下内容添加到项目中的 .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

如果您在Linux上安装了Gcc 9或更新版本,则可以删除"-C", "linker=clang"


1
我认为如果将其放置在Cargo.toml中,它不会产生任何影响。相反,应该将其放入配置文件中:https://doc.rust-lang.org/cargo/reference/config.html - Kevin

5
这也是可行的,我认为@Jmb实际上就是这个问题。
rustflags = [
  "-C", "linker=clang-12",  # change the version as needed
]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接