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
Macos OpenSSL板条箱在Mac OS X 10.11上编译失败_Macos_Rust_Rust Cargo - Fatal编程技术网

Macos OpenSSL板条箱在Mac OS X 10.11上编译失败

Macos OpenSSL板条箱在Mac OS X 10.11上编译失败,macos,rust,rust-cargo,Macos,Rust,Rust Cargo,我试图在Mac OS X 10.11.2上安装铁锈框架,但在编译openssl的东西时运行cargo build或cargo run时失败了: failed to run custom build command for `openssl-sys-extras v0.7.4` Process didn't exit successfully: `/xxx/rust/hello/target/debug/build/openssl-sys-extras-413d6c73b37a590d/build

我试图在Mac OS X 10.11.2上安装铁锈框架,但在编译
openssl
的东西时运行
cargo build
cargo run
时失败了:

failed to run custom build command for `openssl-sys-extras v0.7.4`
Process didn't exit successfully: `/xxx/rust/hello/target/debug/build/openssl-sys-extras-413d6c73b37a590d/build-script-build` (exit code: 101)
--- stdout
TARGET = Some("x86_64-apple-darwin")
OPT_LEVEL = Some("0")
PROFILE = Some("debug")
TARGET = Some("x86_64-apple-darwin")
debug=true opt-level=0
HOST = Some("x86_64-apple-darwin")
TARGET = Some("x86_64-apple-darwin")
TARGET = Some("x86_64-apple-darwin")
HOST = Some("x86_64-apple-darwin")
CC_x86_64-apple-darwin = None
CC_x86_64_apple_darwin = None
HOST_CC = None
CC = None
HOST = Some("x86_64-apple-darwin")
TARGET = Some("x86_64-apple-darwin")
HOST = Some("x86_64-apple-darwin")
CFLAGS_x86_64-apple-darwin = None
CFLAGS_x86_64_apple_darwin = None
HOST_CFLAGS = None
CFLAGS = None
running: "cc" "-O0" "-ffunction-sections" "-fdata-sections" "-g" "-m64" "-fPIC" "-o" "/xxx/rust/hello/target/debug/build/openssl-sys-extras-413d6c73b37a590d/out/src/openssl_shim.o" "-c" "src/openssl_shim.c"
ExitStatus(Code(1))


command did not execute successfully, got: exit code: 1



--- stderr
src/openssl_shim.c:1:10: fatal error: 'openssl/hmac.h' file not found
#include <openssl/hmac.h>
     ^
1 error generated.
thread '<main>' panicked at 'explicit panic', /xxx/.cargo/registry/src/github.com-0a35038f75765ae4/gcc-0.3.21/src/lib.rs:772

我不知道我必须做些什么才能让这个安装工作正常,并尝试一下Iron。

从rust openssl版本0.8开始,自制安装的openssl库将由板条箱自动检测,无需设置额外的环境变量

如果您需要支持之前的版本或选择不使用自制软件,请继续阅读


这是一个(也是和),但不是一个板条箱可以修复

快速解决方案是使用自制软件安装OpenSSL,然后通过设置
OpenSSL\u INCLUDE\u DIR
OpenSSL\u LIB\u DIR
环境变量显式指向找到OpenSSL的目录:

OPENSSL\u INCLUDE\u DIR=/usr/local/ceral/OPENSSL/1.0.2e/INCLUDE\
OPENSSL_LIB_DIR=/usr/local/ceral/OPENSSL/1.0.2e/LIB\
货物建造
如果您已经完成了一个
货物构建
,则需要首先运行
货物清理
,以清除一些陈旧的缓存信息

如果不想为打开的每个shell设置此选项,请将其添加到shell初始化文件中(如
~/.bash\u profile
)。您可以通过不硬编码版本号来降低其脆弱性:

export OPENSSL\u INCLUDE\u DIR=$(brew--前缀OPENSSL)/INCLUDE
导出OPENSSL_LIB_DIR=$(brew--前缀OPENSSL)/LIB
如果您不想使用自制软件,请遵循相同的过程,但使用指向OpenSSL副本的适当路径


更长期的原因是:

OpenSSL没有一个稳定的ABI,因此出于兼容性目的,苹果维护了一个与早期ABI之一兼容的fork。他们不赞成10.7中的OpenSSL,最后在10.11中删除了头文件,以推动OSX应用程序开发人员捆绑自己的OpenSSL或使用他们的框架。dylibs被保留了下来,因此未更新的应用程序不会中断。您仍然可以链接到它们,但这样做会带来一些奇怪的兼容性问题(除非您从较早的OSX版本中获取标题)


如果已安装homebrew的openssl,只需将以下内容添加到Cargo.toml中:

[target.x86_64-apple-darwin.openssl-sys]
rustc-link-search = [ "/usr/local/opt/openssl/lib" ]
rustc-link-lib = [ "ssl", "crypto" ]
include = [ "/usr/local/opt/openssl/include" ]
然后
货物清洁和货物建造
。通过在库加载路径中引入不兼容的openssl,不会破坏OSX,当您想要构建时,也不会忘记设置/取消设置环境变量(或者在不使用Rust工具时污染shell环境)。总而言之,这是一种更快乐、更少愤怒的方法

我无法将此答案添加到它所属的位置(因为它取决于自制软件),因为我决定将其关闭,但我将在此处回答并链接到该问题。

像这样使用:

brew install openssl
export OPENSSL_INCLUDE_DIR=`brew --prefix openssl`/include
export OPENSSL_LIB_DIR=`brew --prefix openssl`/lib
cargo clean
cargo build
MacPorts的答案是:

sudo port install openssl
export OPENSSL_INCLUDE_DIR=/opt/local/include
export OPENSSL_LIB_DIR=/opt/local/lib
cargo clean
cargo build

我非常确信,运行
brew链接--force openssl
和安装的
pkg config
将自动解决此问题。也就是说,在默认情况下使用openssl库可能不是一个好主意,我不确定。@Vladimitavevevev是的,这在一些问题中提到过,但在我彻底理解之前,我同样对类似于
--force
的东西持谨慎态度。我希望自制开发人员能尽全力,提出一个我可以遵循的可靠建议。:-)在这种情况下,AFAIK--force只覆盖公式中的设置,默认情况下不创建符号链接。因此,这不会产生任何危险,甚至可以通过
brew取消链接
进行恢复。但是,是的,我不知道在
/usr/local/lib
中提供openssl库的后果。我在hyper中遇到了类似的问题,这也帮助我解决了它。请注意,这个解决方案(似乎合理)似乎不依赖于自制;无论您如何或在何处安装了openssl,您都应该能够添加这些配置变量。最大的缺点是您将代码绑定为仅在您的机器(或具有类似布局的机器)上运行。并非所有的
x86\u 64-apple-darwin
目标都有相同的安装路径。诚然,这不是一个硬的自制依赖项,但您确实需要在El Cap之前自己安装openssl,因为系统openssl的头已经不存在了(加上它太旧了,无法大量使用)。是的;这似乎与另一个答案底部的引语相符。像Fink或MacPorts这样的东西还存在吗?我想人们总是可以编译他们自己的OpenSSL版本…他们是的,但在我不那么谦虚的观点中,hombrew是一个明显更好的选择,原因大致相同,我不喜欢使用
brew链接--force OpenSSL
方法的想法,它们污染了系统,很难清理。这在2017年4月El Capitan OSX上对我起了作用。20世纪20年代10月15日,卡塔琳娜10.15.7节,我感谢你。有趣的是,真正的答案就在这里。
sudo port install openssl
export OPENSSL_INCLUDE_DIR=/opt/local/include
export OPENSSL_LIB_DIR=/opt/local/lib
cargo clean
cargo build