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

Unreal Engine 5集成OpenSSL 3.1.0崩溃问题求助

解决UE5中使用OpenSSL 3.1.0运行时崩溃问题

崩溃错误码0xc06d007e本质是指定的模块无法找到,结合调用栈里的__delayLoadHelper2()和_tailMerge_libcrypto_3_x64_dll(),核心问题出在延迟加载的OpenSSL DLL无法被正确加载,或与UE自带的OpenSSL版本冲突。以下是针对性解决方案:

1. 确保DLL路径被Unreal识别

延迟加载的DLL必须放在Unreal编辑器能搜索到的目录中:

  • 将libcrypto-3-x64.dll和libssl-3-x64.dll复制到项目的Binaries/Win64目录、插件的Binaries/Win64目录,或Unreal Editor的安装目录(如Epic Games/UE_5.x/Engine/Binaries/Win64)。
  • 也可以在代码中手动指定DLL的绝对路径加载,避免系统搜索路径问题。

2. 排除UE自带OpenSSL的版本冲突

UE5默认集成OpenSSL v1,会与你引入的v3.1.0产生符号混淆:

  • 在插件的Build.cs中,移除对UE自带OpenSSL模块的依赖:
    if (PrivateDependencyModuleNames.Contains("OpenSSL"))
    {
        PrivateDependencyModuleNames.Remove("OpenSSL");
    }
    
  • 强制使用OpenSSL 3的API定义,在Build.cs中添加:
    PublicDefinitions.Add("OPENSSL_API_COMPAT=0x30000000L");
    
  • 确保自定义OpenSSL的头文件搜索优先级最高,将PublicIncludePaths的添加方式改为:
    PublicIncludePaths.Insert(0, Path.Combine(ModuleDirectory, "ThirdParty/OpenSSL3/include"));
    

3. 匹配OpenSSL与UE的编译环境

OpenSSL的编译配置必须与UE的编译环境完全一致:

  • 使用与UE5相同的MSVC版本(如UE5.1+对应VS2022)编译OpenSSL。
  • 编译OpenSSL时选择与当前UE构建配置匹配的版本:
    • 若运行UE编辑器的Development模式,OpenSSL需编译为Release版本;
    • 若运行DebugGame模式,OpenSSL需编译为Debug版本。
  • 编译时指定x64架构,使用命令:perl Configure VC-WIN64A,再执行nmake编译。

4. 手动加载DLL并验证加载状态

放弃延迟加载,在模块启动时手动加载DLL,明确排查加载失败原因:
在插件模块的StartupModule()中添加代码:

#include "Misc/Paths.h"
#include "Misc/PlatformProcess.h"
#include "Logging/LogMacros.h"

void UYourPluginModule::StartupModule()
{
    // 替换为你的OpenSSL DLL实际路径
    FString CryptoDllPath = FPaths::Combine(ModuleDirectory, TEXT("../ThirdParty/OpenSSL3/bin/libcrypto-3-x64.dll"));
    void* CryptoDllHandle = FPlatformProcess::GetDllHandle(*CryptoDllPath);
    
    if (!CryptoDllHandle)
    {
        UE_LOG(LogTemp, Fatal, TEXT("Failed to load libcrypto-3-x64.dll from path: %s"), *CryptoDllPath);
    }

    FString SslDllPath = FPaths::Combine(ModuleDirectory, TEXT("../ThirdParty/OpenSSL3/bin/libssl-3-x64.dll"));
    void* SslDllHandle = FPlatformProcess::GetDllHandle(*SslDllPath);
    
    if (!SslDllHandle)
    {
        UE_LOG(LogTemp, Fatal, TEXT("Failed to load libssl-3-x64.dll from path: %s"), *SslDllPath);
    }
}

如果启动时触发Fatal日志,说明路径错误或DLL本身损坏,需检查路径或重新编译OpenSSL。

5. 验证OpenSSL API调用的正确性

虽然EVP_MD_CTX_new()是OpenSSL 3.0+的标准函数,但需确保代码中未混用旧版API:

  • 检查代码中是否同时包含UE自带的openssl/evp.h和自定义OpenSSL的头文件,确保只引入自定义路径下的头文件。
  • 若仍有问题,可尝试直接调用DLL导出函数,确认符号是否存在:
    typedef EVP_MD_CTX* (*EVP_MD_CTX_NEW_FUNC)();
    EVP_MD_CTX_NEW_FUNC EVP_MD_CTX_new_ptr = (EVP_MD_CTX_NEW_FUNC)FPlatformProcess::GetDllExport(CryptoDllHandle, TEXT("EVP_MD_CTX_new"));
    if (!EVP_MD_CTX_new_ptr)
    {
        UE_LOG(LogTemp, Fatal, TEXT("Failed to find EVP_MD_CTX_new in libcrypto-3-x64.dll"));
    }
    EVP_MD_CTX* ctx = EVP_MD_CTX_new_ptr();
    

内容的提问来源于stack exchange,提问作者Arnab Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:03:13