Rust Linux版本glibc未找到-编译不同的glibc / libc6版本



我在一个Linux系统上编译了一个Rust二进制文件,并尝试在另一个Linux系统上运行它。当我运行程序时,我得到:

./hello-rust: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by ./hello-rust)

系统上已经安装了GLIBC(又名libc6),但是,版本是2.31。是否有一种方法可以为较新版本的libc6编译程序?

根据问题:https://github.com/rust-lang/rust/issues/57497 -没有办法告诉Rust编译器链接系统上安装的库以外的其他库。

这意味着我必须在安装了较新版本libc6的系统上编译二进制文件-那么二进制文件应该与相同版本的libc6或较新版本兼容*

最方便的方法是使用具有目标libc6版本和rust的Docker镜像。

对于我自己来说,官方的Rust docker镜像有正确的版本,我可以使用它来编译我的目标。

在工作目录中:

sudo docker pull rust
sudo docker run --rm --user "$(id -u)":"$(id -g)" -v "$PWD":/usr/src/myapp -w /usr/src/myapp rust cargo build --release

如果基于Debian的官方镜像不满足版本要求,你将不得不创建一个自定义的docker镜像,即:

  • fork官方的Rust docker镜像并将其设置为使用旧版本的Debian
  • 或创建一个基于旧Debian或其他Linux发行版映像的映像,并配置它来安装rustup

*我可以在libc6 2.32的系统上使用libc6 2.31编译的二进制文件-我不确定向后兼容性有多远。

如果您想要一种简单的方法,可以尝试交叉项目。它需要Docker,但是非常简单。

cargo install cross --git https://github.com/cross-rs/cross

确保你的用户可以运行Docker:

sudo usermod -aG docker ${USER}
然后,例如,如果要编译armv6l拱:
cross build --target arm-unknown-linux-gnueabihf --release

如果你想编译armv7l:

cross build --target armv7-unknown-linux-gnueabihf --release

编译后的文件将被放置在通常的target/armv7-unknown-linux-gnueabihf/release/…文件夹。

确保使用命令arch检查目标系统中正确的目标arch。例子:

pi@raspberrypi:~ $ arch
armv6l

最新更新