Windows环境执行cargo run时openssl-sys编译报权限拒绝错误
报错核心定位
从编译日志可判定,openssl-sys依赖未对接系统已通过vcpkg安装的OpenSSL库,因未检测到OPENSSL_NO_VENDOR环境变量,自动触发内置OpenSSL源码编译流程,编译过程因系统权限不足无法执行外部构建指令,最终抛出"Access is denied"的权限错误。
分步处理方案
- 强制关闭openssl-sys的内置源码编译逻辑
- 先通过vcpkg安装匹配x86_64 MSVC架构的静态OpenSSL库,在vcpkg根目录执行命令:
vcpkg install openssl:x64-windows-static - 配置openssl-sys的识别路径,依次设置以下系统环境变量,确保依赖能直接定位到已安装的库,不再触发自行编译逻辑:
OPENSSL_DIR:指向vcpkg安装OpenSSL的根目录,一般为vcpkg安装路径下的installed\x64-windows-static文件夹OPENSSL_NO_VENDOR = 1:完全禁用内置源码编译模式- 如出现路径识别异常,可补设
OPENSSL_INCLUDE_DIR指向上述路径下的include目录,OPENSSL_LIB_DIR指向上述路径下的lib目录
- 先通过vcpkg安装匹配x86_64 MSVC架构的静态OpenSSL库,在vcpkg根目录执行命令:
- 清理旧的异常构建缓存
之前触发的内置编译流程已生成带权限限制的临时文件,在项目根目录执行cargo clean清空项目编译缓存,同时删除Cargo本地缓存中残留的openssl相关构建产物(路径为用户目录下.cargo\registry\src\中对应版本的openssl-src、openssl-sys文件夹),避免旧文件的权限问题影响重新编译。 - 低维护成本替代方案
如对接原生OpenSSL始终出现路径或权限问题,可直接调整项目依赖的TLS实现,完全绕开openssl-sys的编译流程:修改项目Cargo.toml,将Rocket框架默认的OpenSSL依赖替换为Rustls纯Rust实现的TLS栈,从根源上避免Windows平台的OpenSSL编译兼容问题。
操作完成后重新执行
cargo run即可正常完成编译。
内容的提问来源于stack exchange,提问作者mooy bot
相关产品推荐
相关产品推荐

