找回密码
 立即注册
查看: 313|回复: 0

Unreal 第三方库接入依赖opencv与引擎内的opencv冲突问题记录

[复制链接]
发表于 2023-8-15 18:23 | 显示全部楼层 |阅读模式
有些项目中会引用一些本身的第三方库,第三库也有很多本身的依赖的dll项。
如果你外部接入的第三方库内有opencv_world455.dll(本身编译出来的或者官网下载的,和UE引擎的纷歧致的话,那么你的引擎项目又使用了unreal内部的opencv_world455版本,或者说你的项目引用了UE引擎内的opencv插件的话,那么再你加载本身的第三方库的时候很有可能会犯错)
犯错现象:卡在75%(或者某个百分比)加载不外去。这个取决于你的插件.uplugin文件的的Loading Phase。
本文章用455来举例。
犯错的原因:一般加载dll的代码使用的是 FPlatformProcess::GetDllHandle(*DLLPath),如果之前已经加载过了,就会直接返回之前的句柄。按照名称决定的。所以因为引擎初始化时候加载了引擎opencv插件内的opencv_world455.dll,加载你本身做的第三方库的插件的时候,你的第三方库也用到了opencv_world455.dll, 但是这个dll和引擎内的dll并不不异,可能是你本身编译的,或者网上下载的,比如增加一些cuda功能。这个时候由于opencv_world455.dll已经加载过了,在load你的dll的时候,在GetDllHandle函数内部会分析你的这个dll有哪些dll依赖,如果之前系统内加载过就用之前加载过的。所以这里会犯错。




加载挨次:
引擎版本UE5.0.3, 内置opencv版本455。集成算法的dll依赖opencv_world455。如果是项目中使用了opencv,那么引擎内的455会先加载。


加载位置:引擎的Source/Plugins/Runtime下面的OpenCV插件。因为插件的LoadingPhase = PostConfigInit,所以该插件是会被先加载。


OpenCV.Build.cs这里面设置了延迟加载,然后在OpenCVHelper的Module的StartModule里面会加载opencv的dll。如下图。



因为引擎默认的dll加载挨次快,你又不好调整挨次。所以当你本身的项目去加载外部的dll的时候(dll内部也引用了不异名称的opencv_world455.dll的时候)所以就错了。

提供一种解决方案:
重定名dll库名称的方式:
1>将lib库的用nodepad++打开编纂,全部替换,比如 opencv_world455.lib   opencv_world455.dll。我将lib库编纂后,将里面的所有的opencv_world455替换成opencv_selfc455, 注意:这里长度要保持一致,否则会损坏lib,接着将opencv_world455.dll改名成opencv_selfc455.dll,将 opencv_world455.lib改名成 opencv_selfc455.lib。
2>将你的第三方库的编译部门从头Link一下改名后的。
或者将unreal engine内的opencv插件的 build.cs内的加载改削一下。就能解决这个问题。



通过名称改削,让不异名称但是内容分歧的opencv_world455.dll的分袂都加载,返回分歧句柄,就能解决这个问题了。

补充:
1>DLL依赖分析东西:https://github.com/lucasg/Dependencies/releases
2>本文不局限与455版本,只是提供一种思路。
3>还有某些情况,直接会卡住没有任何的提示,感觉不是很友好.具体代码位置截图。


4>在网上看到一些其他方式说是能加载两个不异名称的dll,但是要以绝对路径加载,没有测验考试过,或者大师有更好的方案欢迎在评论区讨论。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-17 01:41 , Processed in 0.140388 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表