You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级OpenSSL 1至OpenSSL 3后,exe目录自动生成bcrypt.dll引发跨版本崩溃求助

问题原因与解决方案

原因分析

OpenSSL 3在Windows平台构建时,部分编译脚本(或第三方预编译包)会错误地将系统自带的bcrypt.dll复制到程序输出目录。这是因为OpenSSL 3依赖Windows原生BCrypt加密API,但构建流程中误把编译机器本地的bcrypt.dll当作依赖资源打包,而非依赖系统默认路径的版本。由于不同Windows版本的bcrypt.dll存在兼容性差异,复制本地版本会导致程序在其他系统上调用不兼容的DLL,直接引发崩溃。

解决方法

1. 自行编译OpenSSL时调整配置

如果是自己编译OpenSSL 3,在配置阶段添加参数阻止复制系统DLL:

  • 运行Configure命令时追加--no-copy-deps参数,阻止构建脚本自动复制依赖的系统DLL:
    Configure VC-WIN64A --prefix=C:\OpenSSL3 --no-copy-deps
    
  • 若编译完成后输出目录仍有bcrypt.dll,直接删除即可,仅保留OpenSSL自身的核心DLL(如libcrypto-3-x64.dll、libssl-3-x64.dll)。

2. 修改项目构建流程(使用预编译库时)

如果用的是预编译OpenSSL库,检查项目构建脚本:

  • Visual Studio项目:
    • 打开项目属性,进入「链接器->输入」,确认bcrypt.lib是从系统默认库路径引用,而非本地自定义路径。
    • 进入「生成事件->后期生成事件」,删除任何复制bcrypt.dll的命令。
  • CMake项目:
    • 在CMakeLists.txt中确保链接系统原生的bcrypt.lib,并移除手动复制bcrypt.dll的指令:
      target_link_libraries(YourProject PRIVATE bcrypt.lib)
      # 删除类似 file(COPY ... bcrypt.dll ...) 的语句
      

3. 更换合规的预编译包

避免使用附带系统DLL的第三方预编译包,选择官方或可信渠道提供的仅包含OpenSSL自身组件的版本。官方预编译包通常不会附带bcrypt.dll,仅依赖系统自带版本。

内容的提问来源于stack exchange,提问作者Nissim Levy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:35:22