当我在货物文件中添加SSL依赖项时,我无法构建我的Rust项目。这对Windows来说并不陌生,但我想解决这个问题,以便我可以使用Powershell和本机Windows开发来处理我的Rust项目。
有问题的依赖关系如下:
[dependencies.ws]
version = "0.8.0"
features = ["ssl"]
当我运行cargo build
时,我在Windows上遇到很多关于SSL的错误,所以让我们一步一步地开始调试。
第一个错误:
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
好吧,让我们设置qazxsw poi,qazxsw poi和qazxsw poi
OPENSSL_LIB_DIR
但是,现在运行OPENSSL_INCLUDE_DIR
或OPENSSL_DIR
实际编译,但我不认为SSL工作正常,因为连接到websocket的代码路径失败,错误无。
我从以下网站安装了最新的(1.1.0j)完整(非超薄)OpenSSL版本:$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
到我的https://slproweb.com/products/Win32OpenSSL.html。
当OPENSSL_CONF: C:\OpenSSL-Win64\bin\openssl.cfg
实际编译时,websocket失败并出现错误C:\OpenSSL-Win64\bin
PATH
块在我的Windows机器上执行,但我的Linux机器从不执行此代码块。
就这样我们在同一页面上,这是print语句的输出:
cargo build
没有不是一个非常具有描述性的答案。所以我认为我只需要一些证书,因为OpenSSL没有证书。我从网上某处下载了一个cacert.pem并将其放入OpenSSL安装的certs文件夹中,但这也没有太大的区别。仍然是相同的None
错误。
在我的Linux机器上,我希望websocket连接成功,并使代码继续到on_error
:
fn on_error(&mut self, err: ws::Error) {
println!("On Error, {}", err)
}
有没有人在他们的Windows开发环境中解决这个OpenSSL问题?
根据Cloud的建议,我尝试使用VCPKG。不幸的是它没有用。
None
然后我在powershell窗口中设置变量:
on_open
然后我运行fn on_open(&mut self, _: ws::Handshake) -> ws::Result<()> {
...
}
然后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 ...
我仍然得到相同的错误,我的websocket投掷错误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'
。
这里仍然没有运气。
C / C ++库的货物构建逻辑实际上非常简单,它只是编译一个生锈程序,它搜索包含路径和库,然后产生一些文本输出,货物将消耗它。
从cargo clean
我可以看到一些cargo build
关键字,然后我建议你只需使用None
来解决所有的依赖关系,并摆脱那些env变量。