针对较旧的 libc 版本构建并绑定

Mic*_*ael 12 libc rust

我的代码中有需要 libc 的依赖项。在 Ubuntu 20.04 (glibc 2.31) 上构建 ( cargo build --release) 时,生成的可执行文件无法在 CentOS 7 (glibc 2.17) 上运行。它会抛出一个错误,指出它需要 GLIBC 2.18。

在 CentOS 7 上构建相同的代码时,生成的可执行文件可以在 CentOS 7 和 Ubuntu 20.04 上运行。

有没有办法控制在 Ubuntu 20.04 上构建此版本所需的 GLIBC 版本?

har*_*mic 10

如果您的项目不依赖于任何本机库,那么最简单的方法可能是使用目标x86_64-unknown-linux-musl

该目标静态链接到MUSL Libc,而不是动态链接到系统的 libc。因此,它生成完全静态的二进制文件,可以在各种系统上运行。

要安装此目标:

rustup target add x86_64-unknown-linux-musl
Run Code Online (Sandbox Code Playgroud)

要使用此目标构建您的项目:

cargo build --target x86_64-unknown-linux-musl
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅版本指南。

如果您使用任何非 Rust 库,就会变得更加困难,因为它们可能是动态链接的,并且可能反过来依赖于系统 libc。在这种情况下,您要么需要静态链接外部库(假设这是可能的,并且您正在使用的库将与 MUSL libc 一起使用),要么为您想要的每个目标平台进行不同的构建。

如果您最终必须为每个平台进行不同的构建,那么 Docker 容器将是实现这一目标的最简单方法。


小智 8

尝试cross

全局安装:

cargo install cross

然后用它构建你的项目:

cross build --target x86_64-unknown-linux-gnu --release

cross采用相同的参数,cargo但您必须明确指定目标。另外,构建目录始终是target/{TARGET}/(debug|release),而不是target/(debug|release)

cross使用针对不同目标架构预先构建的 docker 映像,但没有什么可以阻止您针对主机架构进行“交叉编译”。这些 docker 镜像中的 glibc 版本应该足够保守。如果不是,您始终可以配置cross为使用自定义图像。