Macos OpenSSL板条箱在Mac OS X 10.11上编译失败
我试图在Mac OS X 10.11.2上安装铁锈框架,但在编译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
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