这是一些奇奇怪怪的问题
一、目前问题,记录
当前文件结构:
//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