rust openssl 静态链接方案

作者algebnaly

日期

编译 typst 时需要产出可在任意 Linux 上运行的静态二进制,否则 GLIBC 版本不对就跑不起来。typst 依赖 OpenSSL,而我日常用的是 Arch —— 折腾一圈后发现,在 Arch 上静态链 OpenSSL 并不省事,最后改用 Alpine 容器构建。

为什么在Arch Linux上静态编译openssl有困难

Arch 的 openssl 包只有 .so,没有 libssl.a / libcrypto.a/etc/makepkg.conf 默认 !staticlibs,打包时会剥掉静态库;官方也不鼓励静态链接(见 FS38844)。所以即便设 OPENSSL_STATIC=1,链接器仍会报 cannot find -lssl。AUR 虽有 openssl-static,但与系统包冲突,不值得折腾。

Alpine 用 musl,且直接提供 openssl-libs-static,配合 rust:alpine 镜像正好。

做法

在项目根目录:

podman run -it --rm -v $(pwd):/work:z -w /work docker.io/library/rust:alpine sh

容器内:

apk add pkgconfig openssl-dev openssl-libs-static build-base
cargo build --release

这样得到的 release 二进制是静态链接的, 不必再操心运行环境的OpenSSL / glibc 版本。