Я не могу построить свой проект Rust, когда я добавляю зависимость SSL в свой файл груза.
Это не ново для Windows, но я хотел бы решить эту проблему так, чтобы я мог использовать Powershell и собственную разработку Windows для работы над моим проектом Rust.
Рассматриваемая зависимость следующая:
[dependencies.ws]
version = "0.8.0"
features = ["ssl"]
Когда я запускаю cargo build
, я получаю много ошибок, связанных с SSL, поскольку я работаю в Windows, поэтому давайте начнем отлаживать этот шаг за шагом.
Первые ошибки:
PS C:\Users\sam\vcs\project> cargo build
Compiling openssl-sys v0.9.43
error: failed to run custom build command for `openssl-sys v0.9.43`
process didn't exit successfully: `C:\Users\sam\vcs\project\target\debug\build\openssl-sys-d964f46e4c48d206\build-script-main` (exit code: 101)
--- stdout
cargo:rustc-cfg=const_fn
cargo:rerun-if-env-changed=X86_64_PC_WINDOWS_MSVC_OPENSSL_LIB_DIR
X86_64_PC_WINDOWS_MSVC_OPENSSL_LIB_DIR unset
cargo:rerun-if-env-changed=OPENSSL_LIB_DIR
OPENSSL_LIB_DIR unset
cargo:rerun-if-env-changed=X86_64_PC_WINDOWS_MSVC_OPENSSL_INCLUDE_DIR
X86_64_PC_WINDOWS_MSVC_OPENSSL_INCLUDE_DIR unset
cargo:rerun-if-env-changed=OPENSSL_INCLUDE_DIR
OPENSSL_INCLUDE_DIR unset
cargo:rerun-if-env-changed=X86_64_PC_WINDOWS_MSVC_OPENSSL_DIR
X86_64_PC_WINDOWS_MSVC_OPENSSL_DIR unset
cargo:rerun-if-env-changed=OPENSSL_DIR
OPENSSL_DIR unset
note: vcpkg did not find openssl as libcrypto and libssl: Aborted because VCPKGRS_DYNAMIC is not set
note: vcpkg did not find openssl as ssleay32 and libeay32: Aborted because VCPKGRS_DYNAMIC is not set
Хорошо, давайте установим OPENSSL_LIB_DIR
, OPENSSL_INCLUDE_DIR
и OPENSSL_DIR
$env:OPENSSL_LIB_DIR="C:\OpenSSL-Win64\lib"
$env:OPENSSL_INCLUDE_DIR="C:\OpenSSL-Win64\include"
$env:OPENSSL_DIR="C:\OpenSSL-Win64"
Тем не менее, теперь выполняющиеся cargo build
или cargo run
фактически компилируются, но я не думаю, что SSL работает правильно, поскольку путь к коду, который подключается к веб-сокету, завершается с ошибкой none.
Я установил последнюю (1.1.0j) полную (не тонкую) версию OpenSSL со следующего веб-сайта: https://slproweb.com/products/Win32OpenSSL.html
Единственная переменная окружения, которую он установил, была:
OPENSSL_CONF: C:\OpenSSL-Win64\bin\openssl.cfg
Но я также добавил C:\OpenSSL-Win64\bin
к своему PATH
.
Когда cargo build
фактически скомпилирован, веб-сокет завершается с ошибкой None
Блок on_error
выполняется на моем компьютере с Windows, но мой компьютер с Linux никогда не выполняет этот блок кода.
Просто мы на одной странице, это вывод оператора print:
fn on_error(&mut self, err: ws::Error) {
println!("On Error, {}", err)
}
Нет, это не очень описательный ответ. Поэтому я предположил, что мне просто нужны некоторые сертификаты, поскольку OpenSSL не поставляется с сертификатами.
Я скачал cacert.pem откуда-то онлайн и поместил его в папку certs установки OpenSSL, но это тоже не имело большого значения. Все та же ошибка None
.
На моем компьютере с Linux я ожидаю, что соединение с веб-сокетом будет успешным, и код перейдет к on_open
:
fn on_open(&mut self, _: ws::Handshake) -> ws::Result<()> {
...
}
Кто-нибудь работал над этой проблемой OpenSSL в своей среде разработки Windows?
ОБНОВЛЕНИЕ 0
По совету Облака я пытался использовать VCPKG. К сожалению, это не сработало.
PS C:\Users\sam\vcs\vcpkg> .\vcpkg.exe list
openssl-windows:x64-windows-static 1.0.2q-2 OpenSSL is an open source project that provides ...
openssl-windows:x86-windows 1.0.2q-2 OpenSSL is an open source project that provides ...
openssl:x64-windows-static 0 OpenSSL is an open source project that provides ...
openssl:x86-windows 0 OpenSSL is an open source project that provides ...
Затем я установил переменные в своем окне powershell:
PS C:\Users\sam\vcs\project> $env:OPENSSL_DIR = 'C:\Users\sam\vcs\vcpkg\installed\x64-windows-static'
PS C:\Users\sam\vcs\project> $env:OPENSSL_STATIC = 'Yes'
PS C:\Users\sam\vcs\project> $env:VCPKGRS_DYNAMIC='1'
Затем я запустил cargo clean
, а затем cargo build
, и я все еще получил ту же ошибку, когда мой websocket выдает ошибку None
.
Все еще не повезло здесь.