Ячейка OpenSSL не скомпилирована в Mac OS X 10.11
Я попытался установить Iron framework для Rust на Mac OS X 10.11.2, но он не удался, когда я запускал cargo build
или cargo run
при компиляции openssl
stuff:
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 попробовать.
Ответы
Ответ 1
Как и в случае версии rust-openssl 0.8, библиотеки OpenSSL, установленные в OpenbL, будут автоматически обнаружены ящиком, нет необходимости устанавливать дополнительные переменные среды.
Если вам нужно поддерживать версию до этого или не использовать Homebrew, читайте дальше.
Это известная проблема (также this и this), но не тот, который может исправить ящик.
Быстрое решение - установить OpenSSL с помощью Homebrew, а затем явно указать на каталоги, где обнаружен OpenSSL, установив переменные среды OPENSSL_INCLUDE_DIR
и OPENSSL_LIB_DIR
:
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
, чтобы очистить нашу устаревшую кешированную информацию.
Если вы не хотите устанавливать это для каждой открытой оболочки, добавьте ее в файлы инициализации оболочки (например, ~/.bash_profile
). Вы можете сделать его немного менее хрупким, не жестко кодируя номер версии:
export OPENSSL_INCLUDE_DIR=$(brew --prefix openssl)/include
export OPENSSL_LIB_DIR=$(brew --prefix openssl)/lib
Если вы не хотите использовать Homebrew, выполните один и тот же процесс, но используя соответствующий путь к вашей копии OpenSSL.
Более длинная причина хорошо описывается andrewtj:
OpenSSL не имеет стабильного ABI, поэтому в целях совместимости Apple поддерживает вилку, совместимую с одним из предыдущих ABI. Они отказались от OpenSSL в 10.7 и, наконец, сбросили заголовки в 10.11, чтобы подтолкнуть разработчиков приложений OS X к объединению своего OpenSSL или использованию их фреймворков. Дилибы остались, поэтому приложения, которые не были обновлены, не сломаются. Вы по-прежнему можете ссылаться на них, но вы открываете себе проблемы с нечетной совместимостью, делая это (если вы не захватите заголовки из более ранней версии OS X).
Ответ 2
С Brew используйте вот так:
brew install openssl
export OPENSSL_INCLUDE_DIR=`brew --prefix openssl`/include
export OPENSSL_LIB_DIR=`brew --prefix openssl`/lib
cargo clean
cargo build
Ответ 3
Если у вас есть встроенный opensl, просто добавьте следующее в свой 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 && cargo build
. Не нарушать OS X, введя несовместимые openssl в пути загрузки библиотеки и не забывая устанавливать/отменять переменные среды, когда вы хотите построить (или загрязнять среду оболочки, когда не работаете с материалами Rust). В целом гораздо более счастливый и менее беспризорный подход.
Я не могу добавить этот ответ в мой собственный вопрос, где он принадлежит (потому что он зависит от доморощенного), потому что Shepmaster решил, что он должен быть закрыт, но я отвечу здесь и свяжусь с этим вопросом.
Ответ 4
fooobar.com/info/501347/... ответ для MacPorts:
sudo port install openssl
export OPENSSL_INCLUDE_DIR=/opt/local/include
export OPENSSL_LIB_DIR=/opt/local/lib
cargo clean
cargo build