【问题标题】:Runtime error when referencing external library in Unreal Engine在虚幻引擎中引用外部库时出现运行时错误
【发布时间】:2018-08-16 18:08:44
【问题描述】:

我按照本教程中的步骤操作:

https://wiki.unrealengine.com/How_to_Link_External_C_Libraries_.dll_.lib_With_Your_Project_%26_Package_With_Game,_Fast_And_Easy

我能够连续引用外部 c++ 库并且项目编译得很好。但是,在运行时,当我从外部库实例化一个对象时,我收到以下错误:

在 UE4Editor.exe 中的 0x00007FFD7244FD31 (mscordacwks.dll) 处引发异常:0xC0000005:访问冲突读取位置 0x0000000000000000。发生的源信息丢失 该模块的调试信息

堆栈是:

mscordacwks.dll!ClrDataAccess::EnumMemDumpAllThreadsStack(enum CLRDataEnumMemoryFlags) 未知的非用户代码。已加载符号。 mscordacwks.dll!ClrDataAccess::EnumMemoryRegionsWorkerMicroTriage(枚举 CLRDataEnumMemoryFlags) 未知的非用户代码。已加载符号。 mscordacwks.dll!ClrDataAccess::EnumMemoryRegionsWrapper(枚举 CLRDataEnumMemoryFlags) 未知的非用户代码。已加载符号。 mscordacwks.dll!ClrDataAccess::EnumMemoryRegions(结构 ICLRDataEnumMemoryRegionsCallback ,unsigned int,enum CLRDataEnumMemoryFlags) 未知的非用户代码。已加载符号。 dbgcore.dll!GenGetProcessInfo(unsigned long,struct _MINIDUMP_STATE ,struct _INTERNAL_PROCESS ,struct _LIST_ENTRY *) 未知非用户 代码。已加载符号。 dbgcore.dll!MiniDumpProvideDump() 未知 非用户代码。已加载符号。 dbgcore.dll!MiniDumpWriteDump() 未知的非用户代码。已加载符号。 UE4Editor-Core.dll!00007ffdb17e95fb() Unknown 未加载符号。 UE4Editor-Core.dll!00007ffdb17ded6a() Unknown 未加载符号。 UE4Editor-Core.dll!00007ffdb17d2865() Unknown 未加载符号。 UE4Editor-Core.dll!00007ffdb17e0864() Unknown 未加载符号。 [外部代码]带注释的框架

发生错误的行:

CSharpClassExposer* scharpClassExposer = nullptr;
scharpClassExposer = new CSharpClassExposer();

我引用的外部库是 C++ CLI(托管 C++),它进一步包装了 C# dll,我确信它与此有关。但是,在我的单独测试项目中,我使用同一个托管库和本地 c++ 控制台客户端而不是虚幻引擎,一切正常。

知道如何解决这个问题吗?

【问题讨论】:

    标签: c++ unreal-engine4


    【解决方案1】:

    当我调用外部库的基本方法/函数/构造函数时,我遇到了与您相同的问题(我从 Windows 核心 dll 中遇到了异常)。

    我必须告诉引擎必须加载哪个 DLL,对应于您提供给数组 PublicAdditionalLibraries 的 .lib

    PublicDelayLoadDLLs 是您可以从 Build.cs 访问的另一个数组,您必须使用要链接的每个 .dll 来填充它。

    我的 Build.cs 中有这样的东西:

    PublicAdditionalLibraries.Add(Path.Combine(LibrariesPath, "myExternalLib.lib")); PublicDelayLoadDLLs.Add("myExternalLib.dll");

    然后当你的模块被加载时,你必须告诉引擎它必须加载哪个 DLL。例如,在您的 void MyModule::StartupModule() 方法中,您必须设置库文件夹

    FString AbsPath = FileManager::Get().ConvertToAbsolutePathForExternalAppForRead(*MyLibPath); FPlatformProcess::AddDllDirectory(AbsPath)

    然后要求加载库:

    void* DLLHandle3 = FPlatformProcess::GetDllHandle( L"myExternalLib.dll" );

    这些步骤修复了我使用一些外部库方法时引发的异常。

    如果我很好地理解了我在虚幻论坛上找到的内容,引擎使用 .lib 编译并知道存在哪个函数,但需要 .dll 动态加载最终可执行文件中未包含的所有依赖项。 (对于 cpp 开发人员来说有点奇怪,这就是为什么我不确定这部分)

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2016-08-11
      • 1970-01-01
      • 2019-01-13
      • 2018-11-02
      • 2020-09-25
      • 1970-01-01
      • 2015-04-16
      • 2021-03-02
      • 2012-02-07
      相关资源
      最近更新 更多