Rust 如何为x86_64-unknown-linux-musl构建依赖于curl的可执行文件
我在一台amd64 Debian机器上,正在尝试构建一个x86_64-unknown-linux-musl可执行文件。我的货物里有这个。汤姆:Rust 如何为x86_64-unknown-linux-musl构建依赖于curl的可执行文件,rust,musl,Rust,Musl,我在一台amd64 Debian机器上,正在尝试构建一个x86_64-unknown-linux-musl可执行文件。我的货物里有这个。汤姆: [dependencies] curl = "0.4" 当我运行cargo build--target=x86_64-unknown-linux-musl时 这: 错误:无法为`libz sys v1.0.10运行自定义生成命令` 进程未成功退出:`/tmp/foo/target/debug/build/libz-sys-c20da5f29c41e51
[dependencies]
curl = "0.4"
当我运行cargo build--target=x86_64-unknown-linux-musl时
这:
错误:无法为`libz sys v1.0.10运行自定义生成命令`
进程未成功退出:`/tmp/foo/target/debug/build/libz-sys-c20da5f29c41e515/build脚本build`(退出代码:101)
---stdout
OPT_级别=一些(“0”)
PROFILE=Some(“调试”)
TARGET=Some(“x86_64-unknown-linux-musl”)
调试=真实选项级别=0
HOST=Some(“x86_64-unknown-linux-gnu”)
TARGET=Some(“x86_64-unknown-linux-musl”)
TARGET=Some(“x86_64-unknown-linux-musl”)
HOST=Some(“x86_64-unknown-linux-gnu”)
CC_x86_64-unknown-linux-musl=None
CC_x86_64_未知_linux_musl=None
目标_CC=无
CC=无
HOST=Some(“x86_64-unknown-linux-gnu”)
交叉编译=无
TARGET=Some(“x86_64-unknown-linux-musl”)
HOST=Some(“x86_64-unknown-linux-gnu”)
CFLAGS_x86_64-unknown-linux-musl=None
CFLAGS_x86_64_未知_linux_musl=无
目标值=无
CFLAGS=无
正在运行:“./configure”“--前缀=/tmp/foo/target/x86_64-unknown-linux-musl/debug/build/libz-sys-e109627694e9981e/out”
编译器错误报告对于./configure(可能是remove-Werror)来说太苛刻了。
**/配置中止。
---斯特德尔
线程“main”在“未能成功运行:退出代码:1”处惊慌失措,/home/tshepang/.cargo/registry/src/github.com-1ec6299db9ec823/libz-sys-1.0.10/build.rs:189
当我重新运行它时:
错误:无法为“openssl sys v0.9.6”运行自定义生成命令`
进程未成功退出:`/tmp/foo/target/debug/build/openssl-sys-ac9c042b062dad1d/build script build`(退出代码:101)
---斯特德尔
线程'main'在'
找不到OpenSSL安装目录,此`-sys`板条箱无法安装
在不知情的情况下继续。如果安装了OpenSSL并且此板条箱
找不到它时,您可以为
汇编过程。
如果您认为应该找到目录*
自动,请在打开一个错误https://github.com/sfackler/rust-openssl
并包括有关系统的信息以及此消息。
$HOST=x86_64-unknown-linux-gnu
$TARGET=x86_64-unknown-linux-musl
openssl sys=0.9.6
当我以本机方式构建时,所有这些都可以正常工作,即货物构建--target=x86_64-unknown-linux-gnu
通过四处搜索,我了解了一个环境变量PKG_CONFIG_ALLOW_CROSS:
PKG_CONFIG_ALLOW_CROSS=true cargo build --target=x86_64-unknown-linux-musl
在这样做的过程中,我还发现我丢失了Debian包
命名为libcurl4 openssl dev
正在运行ldd target/target/x86_64-unknown-linux-musl/debug/foo
指示可执行文件已动态链接,然后进行搜索
此外,我还了解了另一个环境变量,
包装配置所有静态:
PKG_CONFIG_ALL_STATIC=true PKG_CONFIG_ALLOW_CROSS=true cargo build --target=x86_64-unknown-linux-musl
这揭示了一大堆失踪的DEP,所有这些(幸运的)
有Debian依赖项。但是安装所有这些都没有帮助,因为,
最后,我仍然在处理一个不可用的可执行文件
静态链接。我屈服了,最终使用了:
这太简单了,您可以在
target/x86_64-unknown-linux-musl/debug
中找到可执行文件curl
板条箱(直接或间接)依赖于两个板条箱libz sys和openssl sys。
名称以“-sys”结尾的板条箱通常是一组到本机C库的FFI(外部函数接口)绑定
构建这样一个“-sys”板条箱需要链接到本机库。如果您的目标是x86_64-unknown-linux-musl,则必须链接到针对musl而不是glic构建的本机库。但是,您在发行版的存储库中找到的大多数软件包都提供了针对glibc构建的库
解决方案是自己构建所需的库,链接到musl而不是glibc
我没有访问Debian安装的权限,但在Ubuntu 16.04上,这与OpenSSL类似:
# this package provides the "musl-gcc" wrapper
apt-get install musl-tools
# you will also need these, if they are not installed yet
apt-get install pkg-config xutils-dev build-essential
# Download and build OpenSSL against musl
VERS=1.0.2j
export CC=musl-gcc
export MUSL_PREFIX=/usr/local/musl
export C_INCLUDE_PATH="$MUSL_PREFIX/include/"
curl -O https://www.openssl.org/source/openssl-$VERS.tar.gz
tar xvzf openssl-$VERS.tar.gz
cd openssl-$VERS
./config --prefix "$MUSL_PREFIX"
make depend
make
sudo make install
export OPENSSL_DIR=/usr/local/musl/
export OPENSSL_STATIC=1
一旦你为libz准备了一个相同的(我还没有尝试构建它),你就应该能够构建你的板条箱:
cargo build --target=x86_64-unknown-linux-musl
生成的二进制文件将位于target/x86_64-unknown-linux-musl/debug/
该工具基本上可以做到这一点,但它位于Docker容器内,以保持主机的清洁
此构建生成的二进制文件应该是静态链接的,甚至不依赖于glibc。这也意味着它会更大,如果在其中一个依赖项中发现安全问题,您需要注意升级任何依赖项(尤其是OpenSSL)
*您可能希望在发布的二进制文件上使用
strip
。cross不支持openssl
cargo build --target=x86_64-unknown-linux-musl