- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个依赖于 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
如何让 cargo
或 rustc
相信我想要一个静态二进制文件?
最佳答案
问题在于,对于每个提供 native 依赖项的 crate - 比如 OpenSSL - 有 build.rs
构建脚本负责将构建和链接选项传递给 Cargo 和 使用rust
。 (例如:他们打印出类似 cargo:rustc-link-lib=static=ssl
的内容,然后 Cargo 读取并相应地执行操作。)
因此仅设置“标准”GCC 环境变量几乎不会产生任何影响。您必须分别检查每个 build.rs
以了解如何强制那个确切的 crate 传送 cargo 它的选项。对于 OpenSSL,其环境变量如 OPENSSL_DIR
、OPENSSL_STATIC
等
另一个障碍是,如果您使用编译器插件,它们也可能与目标三元组一起编译(至少是 docker_codegen)。另一方面,它们在编译过程中动态链接。这意味着不仅必须正确链接静态库,还必须具有 目标 主机种类的动态库,例如 Musl libc.so
,并正确设置 ( LD_LIBRARY_PATH
等)。
我制作了一个经过全面注释的 Dockerfile,它使用一些 native 依赖项静态构建我的项目。它也可能对其他人有帮助。
关于rust - 如何编译具有 native 依赖项的 Rust 项目的静态 musl 二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40695010/
我正在尝试编译各种程序,例如使用 musl 的 MariaDB工具链。也就是说,我不想在编译完成后对 glibc 或 GNU 的链接器有任何依赖。 到目前为止,我一直在使用 musl 的 GCC 包装
Grpc版本:1.24.2 在部署我的 Node.js 应用程序时,我遇到了 grpc package 的二进制文件问题. 错误: Error: Failed to load gRPC binary
musl 团队声称不需要检测 musl libc 的方法,因为它们只实现标准功能并且没有需要检测的怪癖。 直到今天,这种说法很可能是正确的,但它不再是正确的。正常功能检测不起作用,因为该功能存在但已损
我们有基于 alpine linux 的 docker 文件。我想让构建的容器检查 musl 库的版本,我的意思是运行容器并在 RT 中检查 musl 版本我该怎么做? 我试过类似的东西 docker
我想要实现的是使用 musl 编译一个 GNU 独立且隔离的 LLVM 工具链作为clib。 最近LLVM 4.0已发布,具有许多新的炫酷功能,包括生产就绪 LLD ,因此链接步骤也可以由 LLVM
我必须用 musl-gcc 包装器编译一些 c++ 程序,所以我需要 c++ 头文件和库。在我使用它们之前,我想我必须使用 musl-gcc 本身针对 musl 编译 libstdc++ 源代码。 我
我有一个 C99 共享库,我想将其链接到一些静态静态库中(通过 --whole-archive)。 注意:所有静态库都是用-fPIC构建的 我也想构建一个通用的 linux 二进制文件,因此决定使用
所以我正在玩 Alpine Linux,它使用 musl 与 glibc。 我发现由于这个选择,我无法运行 Oracle Java 或在 glibc 下构建的静态二进制文件。 musl 是否应该与更广
我将按照此处显示的示例为Rust包创建一个Dockerfile:https://alexbrand.dev/post/how-to-package-rust-applications-into-min
我正在尝试使用 GHC 为用 Haskell 编写的基于 CGI 的 Web 应用程序构建静态二进制文件,并将其部署在共享服务器上。 我想使用musl ,如this answer所述. 不幸的是,这不
我正在尝试使用 GHC 为用 Haskell 编写的基于 CGI 的 Web 应用程序构建静态二进制文件,并将其部署在共享服务器上。 我想使用musl ,如this answer所述. 不幸的是,这不
我正在尝试让 Rust 在 Docker 中运行以将其用于 32 位 musl 构建。自从我更新它以使用新的 URL 来拉取 rustup 后,我在使用 bash 交互式运行容器时遇到了这个问题: r
我正在尝试在 Alpine 上运行我的 rust 应用程序,但我在使用 musl 作为目标或使用 glibc 的兼容层时遇到了问题。当我尝试从 libc6-compat 使用时,我遇到了这个问题: E
我需要针对 musl-libc 编译一个 C 程序,以使其在嵌入式设备上运行。但是,我无法编译该程序。源取决于我传递给链接器的几个库: /usr/local/musl/bin/musl-gcc app
我在为目标 x86_64-unknown-linux-musl 编译时遇到错误。 这是我的做法: cargo new foo cd foo rustup target add x86_64-unkno
我正在尝试调试在具有 MIPS cpu 的板上远程运行的程序,使用 musl 作为其 libc。 如果我在板上启动 gdbserver,通过 set sysroot /path/to/sysroot
我正在尝试构建 musl-libc在运行 OS X 10.11.5 的计算机上。不幸的是,我在运行 make 时收到以下错误: clang: warning: optimization flag '-
我有一个用 musl libc 编译的共享库 $ readelf -d ./libinterop_d.so Dynamic section at offset 0x8ecb0 contains 22
我正在使用 Nix 作为 Rust 程序的依赖管理器。我有以下 default.nix(简化但有效): rec { pkgs = import {}; hello = pkgs.stdenv
在 musl 库 malloc() 实现中,MMAP_THRESHOLD 值为 229376 字节,因此 bin_index(用于查找存储在“mal.bins”中的空闲 block 以供以后请求使用的
我是一名优秀的程序员,十分优秀!