编译Rust之Stump电子书库
这就是编译和部署中最经典的困境: 编译时:我们需要一个新环境(Debian 12),因为它有程序源码需要的、新的开发工具和库(比如 libglib-2.0 >= 2.70)。 运行时:我们需要产物能在一个旧环境(Debian 11)上运行,因为它只有旧版的系统基础库(glibc)。 幸运的是,Rust 语言的工具链非常强大,它提供了一个完美的解决方案来解决这个悖论。 最终解决方案:静态编译 (Static Compilation using MUSL) 我们的最终目标是生成一个不依赖任何系统库的、完全独立的“绿色”程序。这样它就不再关心你的 VPS 是 Debian 11、12 还是其他什么系统了。 这个技术叫做“静态编译”,我们将使用一个名为 MUSL 的C语言基础库来替代主流的 GLIBC。 GLIBC (动态链接):程序运行时,需要去“借用”操作系统的基础库。操作系统版本不对,就借不到,程序报错。 MUSL (静态链接):在编译的最后一步,把所有需要的基础库功能,像“干粮”一样,全部打包进最终的程序文件里。程序运行时自给自足,完全不依赖外部系统。 这完美地契合了你最初“单文件,占用资源较少,不需要安装依赖”的设想。 终极操作指南:编译一个真正的静态程序 我们将继续使用 Debian 12 作为我们的编译环境(因为它有我们需要的新版开发工具),但我们会告诉编译器,我们的最终目标是生成一个基于 MUSL 的静态程序。 第一步:彻底清理旧环境 和上次一样,我们先删除旧的 stump-builder 容器,确保从一个干净的状态开始。 如果你还在容器里,请 exit。 在你本地电脑的终端运行: Bash docker stop stump-builder docker rm stump-builder 第二步:启动 Debian 12 编译容器 这一步和上次完全一样,我们仍然需要 Debian 12 的新环境来满足编译时的依赖。 Bash docker run -it \ --name stump-builder \ -v "$(pwd)":/build \ --env "HTTP_PROXY=http://172.17.0.1:7890" \ --env "HTTPS_PROXY=http://172.17.0.1:7890" \ debian:12-slim \ /bin/bash 第三步:在 Debian 12 容器内执行全新的编译步骤 进入容器后,请一步步执行以下命令。注意,依赖包和编译命令都发生了变化。 ...