你的浏览器不支持canvas

让我们携手共创奇迹!

模块

Date: Author: LBD

本文章采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。转载请注明来自WindCrazy

这是一些奇奇怪怪的问题

一、目前问题,记录

当前文件结构:

//Plugins/SimInteractor/Source/SimInteractor/Public/SimInteractionComponent.h

#include "thread/Thread.h"//Plugins/SimInteractor/Source/ThirdParty/ZmqProto/include/thread/Thread.h
#include "zmq/zmq.hpp"//Plugins/SimInteractor/Source/ThirdParty/ZmqProto/include/zmq/zmq.hpp
class SIMINTERACTOR_API USimInteractionComponent : public UActorComponent
{
private:
	zmq::context_t Context;				// zmq 上下文
	zmq::socket_t Subscriber;			// 订阅仿真发布消息的连接
	zmq::socket_t Conn;			// 与仿真场景交互的连接

	TT::Thread Thread;		// 接收仿真发布消息的线程
}
//Source/TinderTest/Public/MyActor.h
class USimInteractionComponent;
class TT_TEST_API AMyActor : public AActor
{
private:
	UPROPERTY(EditAnywhere)
	USimInteractionComponent* SimInteractionComponent;
}

不使用**指针声明**上面变量,可能会在加载引擎时初始化,而由于找不到dll,导致崩溃或中断 猜测:假如主模块A依赖插件B模块,而B又依赖第三方库C模块,在加载时可能会创建默认类,如果不是指针则使用默认构造,但是加载dll时可能先加载了A(target.cs中指定了主模块,依据主模块的依赖去构建其他模块,但是这是Build时的行为只能做参考)而发现需要的dll在dlldir中找不到而导致直接中断,而没有去调用B中的StartUpModule函数(就算显示调用GetDllHandle,AddDllDirectory,PushDllDirectory也不行)因而无法找到非常规的目录,所以使用PublicDelayLoadDLLs就会崩溃,不使用就会在75%中断,但是第二个问题

只能放在根目录的Binaries目录下,即使是插件目录下的Binaries/Win64下也不可以,会报UnrealEditor-ModuleName.dll加载失败的错,这个还没有猜测,也就是说和下面这个[教程](https://blog.csdn.net/u010385624/article/details/97797461)有冲突

然后需要将第三方dll文件放置到指定目录中: 在插件中使用第三方库时 放置在插件目录的生成目录中,比如: 在插件MotionMocap中时,放置在如下目录中: D:\UE4_Project\testSlate\Plugins\MotionMocap\Binaries\Win64

注:模块的 StartupModule 是在 FModuleManager::LoadModuleWithFailureReason 中调用的。不管是 LoadModule 或者 LoadModuleChecked 最终都是调用到 LoadModuleWithFailureReason 进行实际的加载和启动的。

同理,FModuleManager::UnLoadModule中执行了模块的ShutdownModule

对于插件中的模块:

PublicIncludePaths和PrivateIncludePaths可以接受特殊字符串开头的字符串:

可接受以下特殊字符串有:

$(ModuleDir) 表示模块目录(D:\UE4_Project\testSlate\Plugins\MotionMocap\Source\MotionMocap)

$(PluginDir) 表示插件目录(D:\UE4_Project\testSlate\Plugins\MotionMocap)

$(EngineDir) 表示引擎目录(D:\Program Files (x86)\UE4\UE_4.22\Engine)

$(ProjectDir) 表示工程目录(D:\UE4_Project\testSlate)

当然RuntimeDependencies 并不仅限于dll,也可以用于其他文件的操作,但path路径必须是以工程路径开始的,比如工程路径为D:\UE4_Project\testSlate\,则path必须是D:\UE4_Project\testSlate\包含的目录下的文件

*path和sourcepath**可接受以下特殊字符串*

**$(ModuleDir) 表示模块目录(D:\UE4_Project\testSlate\Plugins\MotionMocap\Source\MotionMocap)

$(PluginDir) 表示插件目录,仅在插件模块中有效,游戏模块会报错D:\UE4_Project\testSlate\Plugins\MotionMocap

$(EngineDir) 表示引擎目录D:\Program Files (x86)\UE4\UE_4.22\Engine

$(ProjectDir) 表示工程目录D:\UE4_Project\testSlate

$(TargetOutputDir)表示Directory containing the output executable,也就是exe文件输出目录,这个好像只在打包时有效。

$(BinaryOutputDir)表示Directory containing the binary that links this module.也就是dll文件目录

参考资料:Ari谷歌网盘 https://imzlp.com/posts/24007/ https://imzlp.com/posts/16643/ https://ue5wiki.com/wiki/31203/#FindModulePaths https://forums.unrealengine.com/t/whats-the-difference-of-target-cs-file-and-uproject-file/129625/4


对于本文内容有问题或建议的小伙伴,欢迎提出问题