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
相关产品推荐
相关产品推荐

