如何更改默认的 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"
我想让 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"