gpt4 book ai didi

rust - 如何编译具有 native 依赖项的 Rust 项目的静态 musl 二进制文件?

转载 作者:行者123 更新时间:2023-11-29 07:47:45 25 4
gpt4 key购买 nike

我有一个依赖于 Hyper 和 Diesel 的项目,因此依赖于 native 库 OpenSSL 和 libpq。该项目基于 nightly Rust 构建,因为它使用了编译器插件。

我目前的尝试是在 Docker 容器上构建。我有 MUSL libc 和库 make,并使用前缀 /usr/local/musl 安装。我使用以下命令运行 cargo:(不确定某些选项是否多余,我不太精通编译器链,甚至不确定它们是否最终到达链接器,但我必须尝试,对吧。)

LDFLAGS="-static -L/usr/local/musl/lib" \
LD_LIBRARY_PATH=/usr/local/musl/lib:$LD_LIBRARY_PATH \
CFLAGS="-I/usr/local/musl/include" \
PKG_CONFIG_PATH=/usr/local/musl/lib/pkgconfig \
cargo build --release --target=x86_64-unknown-linux-musl

当我ldd 生成的文件时,它揭示了这一点:

$ ldd server
linux-vdso.so.1 (0x00007fffb878e000)
libpq.so.5 => /usr/local/musl/lib/libpq.so.5 (0x00007f4d730e7000)
libssl.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007f4d72e82000)
libcrypto.so.1.0.0 => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007f4d72a85000)
libc.so => /usr/local/musl/lib/libc.so (0x00007f4d727f6000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f4d725f2000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4d72246000)
/lib/ld64.so.1 => /lib64/ld-linux-x86-64.so.2 (0x000055e2124a2000)

有所有动态链接的东西,有些甚至带有“x86_64-linux-gnu”链!出了什么问题?

我可以毫无问题地制作静态链接的、简单的纯 Rust 项目。 ldd 表示它们是静态链接的,并且它们运行没有问题,这与我遇到问题的可执行文件不同。

当我将 --verbose 与 Cargo 一起使用时,我得到了以下实际构建可执行文件的 rustc 命令:http://pastebin.com/ywv0zNBK (糟糕,那个有一个自定义的 outdir-Z print-link-args,是我添加的)添加 print-link-args 标志,我得到以下链接器命令:http://pastebin.com/Aw43qd7h

如何让 cargorustc 相信我想要一个静态二进制文件?

最佳答案

问题在于,对于每个提供 native 依赖项的 crate - 比如 OpenSSL - 有 build.rs 构建脚本负责将构建和链接选项传递给 Cargo 和 使用rust 。 (例如:他们打印出类似 cargo:rustc-link-lib=static=ssl 的内容,然后 Cargo 读取并相应地执行操作。)

因此仅设置“标准”GCC 环境变量几乎不会产生任何影响。您必须分别检查每个 build.rs 以了解如何强制那个确切的 crate 传送 cargo 它的选项。对于 OpenSSL,其环境变量如 OPENSSL_DIROPENSSL_STATIC

另一个障碍是,如果您使用编译器插件,它们也可能与目标三元组一起编译(至少是 docker_codegen)。另一方面,它们在编译过程中动态链接。这意味着不仅必须正确链接静态库,还必须具有 目标 主机种类的动态库,例如 Musl libc.so,并正确设置 ( LD_LIBRARY_PATH 等)。

我制作了一个经过全面注释的 Dockerfile,它使用一些 native 依赖项静态构建我的项目。它也可能对其他人有帮助。

https://gitlab.com/rust_musl_docker/image

关于rust - 如何编译具有 native 依赖项的 Rust 项目的静态 musl 二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40695010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com