【问题标题】:OpenSSL crate fails compilation on Mac OS X 10.11OpenSSL crate 在 Mac OS X 10.11 上编译失败
【发布时间】:2016-04-09 07:40:22
【问题描述】:

我尝试在 Mac OS X 10.11.2 上为 Rust 安装 Iron 框架,但是当我在编译 openssl 的东西时运行 cargo buildcargo 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

openssl 版本似乎还可以:

$ openssl version
OpenSSL 0.9.8zg 14 July 2015

我不知道我必须做什么才能使这个安装工作​​并尝试一下 Iron。

【问题讨论】:

    标签: macos rust rust-cargo


    【解决方案1】:

    从 rust-openssl 0.8 版开始,Crate 会自动检测 Homebrew 安装的 OpenSSL 库,无需设置额外的环境变量。

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


    这是一个known issue(也是thisthis),但不是板条箱可以修复的。

    快速的解决方案是使用 Homebrew 安装 OpenSSL,然后通过设置 OPENSSL_INCLUDE_DIROPENSSL_LIB_DIR 环境变量显式指向找到 OpenSSL 的目录:

    OPENSSL_INCLUDE_DIR=/usr/local/Cellar/openssl/1.0.2e/include \
    OPENSSL_LIB_DIR=/usr/local/Cellar/openssl/1.0.2e/lib \
    cargo build
    

    如果您已经完成了cargo build,则需要先运行cargo clean 以清除我们一些过时的缓存信息。

    如果您不想为打开的每个 shell 都设置此项,请将其添加到您的 shell 初始化文件中(如 ~/.bash_profile)。您可以通过不对版本号进行硬编码来使其不那么脆弱:

    export OPENSSL_INCLUDE_DIR=$(brew --prefix openssl)/include
    export OPENSSL_LIB_DIR=$(brew --prefix openssl)/lib
    

    如果您不想使用 Homebrew,请遵循相同的过程,但使用您的 OpenSSL 副本的适当路径。


    长篇大论很好described by andrewtj

    OpenSSL 没有稳定的 ABI,因此出于兼容性目的,Apple 维护了一个与早期 ABI 之一兼容的分支。他们在 10.7 中弃用了 OpenSSL,并最终在 10.11 中删除了标头,以推动 OS X 应用程序开发人员捆绑他们自己的 OpenSSL 或使用他们的框架。 dylib 已被保留,因此尚未更新的应用程序不会中断。您仍然可以链接它们,但这样做会让自己面临奇怪的兼容性问题(除非您从早期的 OS X 版本中获取标题)。

    【讨论】:

    • 我很确定运行brew link --force openssl 和安装的pkg-config 会自动解决这个问题。也就是说,默认情况下让 openssl 库可用可能不是一个好主意,我不确定。
    • @VladimirMatveev 是的,在一些问题中提到了这一点,但我同样对--force 之类的东西保持警惕,直到我彻底理解它为止。我希望 Homebrew 开发人员能做所有艰苦的工作,并提出我可以遵循的可靠建议。 :-)
    • 好吧,在这种情况下,AFAIK --force 仅覆盖公式中的设置,默认情况下不创建符号链接。所以这不应该做任何危险的事情,甚至可以通过brew unlink 恢复。但是,是的,我不知道在 /usr/local/lib 中提供 openssl 库的后果。
    • 我在 hyper 遇到了类似的问题,这也帮助我解决了这个问题。
    • 我认为只有一个变量export OPENSSL_DIR="$(brew --prefix openssl)"
    【解决方案2】:

    如果您安装了 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" ]
    

    然后是cargo clean &amp;&amp; cargo build。通过在库加载路径中引入不兼容的 openssl 不会破坏 OS X,并且在您想要构建时不要忘记设置/取消设置环境变量(或者在不处理 Rust 的东西时污染您的 shell 环境)。总而言之,这是一种更快乐且不那么令人生气的方法。

    我无法将此答案添加到它所属的 my own question(因为它取决于自制软件),因为 Shepmaster 决定应该关闭它,但我会在这里回答并链接到该问题。

    【讨论】:

    • 请注意,这个解决方案(看起来很合理)似乎并不依赖于自制软件;无论您如何或在何处安装 openssl,您都应该能够添加这些配置变量。最大的缺点是您将代码绑定为仅在您的机器(或具有类似布局的机器)上运行。并非所有x86_64-apple-darwin 目标都具有相同的安装路径。
    • 没错,这不是一个很难的自制依赖,但你确实需要从 El Cap 开始自己安装 openssl,因为系统 openssl 的标题已经消失(而且它太旧了使用)。
    • 是的;这似乎与另一个答案底部的报价相符。 Fink 或 MacPorts 之类的东西仍然存在吗?我想人们总是可以编译自己的 OpenSSL 版本...
    • 它们是,但在我看来,hombrew 是一个更好的选择,原因与我不喜欢使用 brew link --force openssl 方法的想法大致相同,它们会污染系统并很难清理。
    【解决方案3】:

    Brew 像这样使用:

    brew install openssl
    export OPENSSL_INCLUDE_DIR=`brew --prefix openssl`/include
    export OPENSSL_LIB_DIR=`brew --prefix openssl`/lib
    cargo clean
    cargo build
    

    【讨论】:

    • 截至 2017 年 4 月,这对我在 El Capitan OSX 上有效。谢谢
    • 2020 年 10 月在 Catalina 10.15.7 上为我工作
    【解决方案4】:

    https://stackoverflow.com/a/39380733/1317564 对 MacPorts 的回答:

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

    【讨论】:

    • 有趣的是,真正的答案还在这里。
    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    相关资源
    最近更新 更多