【UE·Editor篇】UE编辑器开发的常见编译失败原因总结

最近在学各种编辑器开发的教程,但是作为一个萌新学起来并不顺利。绝大多数教程都是默认读者已经是一个有经验的开发者。我在学这些编辑器扩展相关的教程里,遇到最主要的问题就是各种各样的编译失败。这篇文章就是记录我对这些个编译失败问题的汇总,避免新人和我踩同样的坑。


1.Unable to start program ‘xxx\UE4.exe’.

在这里插入图片描述
原因: 这个错误的原因是我们没有把当前工程项目设置为启动项目。因为我们通常把UE4源码下载到本地一起编译。在复制工程的时候有可能UE4工程变成了启动项,这时点击运行就会出现这个"Unable to start program"的错误。
在这里插入图片描述

2. Failed to generate project files 和 xxx(工程名)could not be complied.

在这里插入图片描述
先说一下怎么在vs工程里增加新的文件,如果在vs里面新建,会出现一个问题,就是当我们右键uproject文件选中重新生成vs项目时会出现新建的代码文件全部消失的问题,因为vs会把新建的文件放在一个临时的文件夹,而当我们重新生成工程时这些临时文件就会被干掉。所以我的做法是直接在文件浏览器下右键生成txt文件再改成代码文件
当我们增加新的文件时,右键uproject文件选中Generate vs project files时可能会提示Failed to generate project files。此时我们双击uproject想打开工程也会发现工程could not be compiled
在这里插入图片描述在这里插入图片描述
原因: 这个问题的原因是我们Editor模块名称不对。Editor模块名称必须等于工程名加上Editor后缀。 比如我的工程名称叫"LearnBP",Editor模块名称必须是"LearnBPEditor"。

3. unresolved external symbol IMPLEMENT MODULE

原因: 这个问题的原因是我们自定义的继承自IModuleInterface的模块类没有加上IMPLEMENT_MODULE这个宏。查看IMPLEMENT_MODULE源码,可以看到它的作用是模块类的初始化,同时导出dll给其他地方调用。在UE4的架构里,即使你这个模块类什么都不做,也依然需要有一个空的模块类并且加上这个宏。
在这里插入图片描述

4. error LNK2019: unresolved external symbol "__declspec(dllimport)

这个错误出现时通常不会只出现一个而是一大串类似错误一起出现。
在这里插入图片描述
原因:没有在.Build.cs加载对应的模块。 在UE4里即使没有加载对应模块vs编译器不会提示你代码有问题。这个时候如果编译就会出现这种一大片编译错误。这个时候就需要检查.Build.cs有没有漏写的模块。比如我图上这种情况就是在.Builds.cs里的PrivateDependencyModuleNames变量里没有添加“Slate”和“Slate Core”模块。

这里可能又有同学要问了,为什么加在PrivateDependencyModuleNames而不是PublicDependencyModuleNames呢?这个原因是我这个例子里的Slate和SlateCore模块并不需要暴露给另外的模块来使用。

再举个例子1:

  • A模块 privateDependency 添加 Slate模块
  • B模块 privateDependency或者pubilcDependency 添加 A模块
  • 这个时候B模块只可以使用A模块,不可以使用Slate模块

再再举个例子2:

  • A模块 pubilcDependency 添加 Slate模块
  • B模块 privateDependency或者pubilcDependency 添加 A模块
  • 这个时候B模块不仅可以使用A模块,还可以使用Slate模块

如果还要区分定义在头文件的函数和定义在cpp文件的函数,则情况更加复杂。详情见这篇文章:UE4 模块,PrivateDependencyModuleNames?

5. Super’: is not a class or namespace name

原因:错误使用Super,Super只有UObject子类才能使用。 我们平常在写UE4代码时习惯了使用Super来表示父类。但其实Super并不是C++本身的东西,是UE4底层自己写的。我们找到UObject的源码(Engine\Source\Runtime\CoreUObject\Public\UObject\Object.h),可以看到这个DECLARE_CLASS 宏,里面定义了Super这个内部变量。在这里插入图片描述
在这里插入图片描述
在做编辑器扩展时,大量的类都不是继承自UObject的,在这种时候是不能使用Super来表示父类。 正确的写法是类名::方法名。比如:

void FExampleDataEditorToolkit::RegisterTabSpawners(const TSharedRef<FTabManager>& InTabManager)
{
    FAssetEditorToolkit::RegisterTabSpawners(InTabManager);
}

关于作者

  • 水曜日鸡,喜欢ACG的游戏程序员。曾参与索尼中国之星项目《硬核机甲》的开发。 目前在某大厂做UE4项目。

CSDN博客:https://blog.csdn.net/j756915370
知乎专栏:https://zhuanlan.zhihu.com/c_1241442143220363264
游戏同行聊天群:891809847

Guess you like

Origin blog.csdn.net/j756915370/article/details/118912210