libobo 发表于 2023-8-15 18:23

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

有些项目中会引用一些本身的第三方库,第三库也有很多本身的依赖的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依赖,如果之前系统内加载过就用之前加载过的。所以这里会犯错。

http://pic2.zhimg.com/v2-a84fa76e3401f80b33dbbfe2f88ad975_r.jpg

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

http://pic1.zhimg.com/v2-76c61c979ff8b441148cfc687e48db84_r.jpg
加载位置:引擎的Source/Plugins/Runtime下面的OpenCV插件。因为插件的LoadingPhase = PostConfigInit,所以该插件是会被先加载。


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

http://pic1.zhimg.com/v2-f3281da27d88b46dbf4c6f254dfed760_r.jpg

因为引擎默认的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内的加载改削一下。就能解决这个问题。

http://pic4.zhimg.com/v2-016baf0c02533587ce8db89db950033b_r.jpg

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

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

http://pic1.zhimg.com/v2-18bddbb47cf296f0c703452db32d1234_r.jpg
4>在网上看到一些其他方式说是能加载两个不异名称的dll,但是要以绝对路径加载,没有测验考试过,或者大师有更好的方案欢迎在评论区讨论。
页: [1]
查看完整版本: Unreal 第三方库接入依赖opencv与引擎内的opencv冲突问题记录