Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何为x86_64-unknown-linux-musl构建依赖于curl的可执行文件_Rust_Musl - Fatal编程技术网

Rust 如何为x86_64-unknown-linux-musl构建依赖于curl的可执行文件

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

我在一台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-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