从UE5.1升级到UE5.4的几个编译失败问题

 if (Target.bBuildEditor)
 {
 	PrivateIncludePaths.Add(System.IO.Path.Combine(GetModuleDirectory("LevelEditor"), "Private"));
 	PrivateDependencyModuleNames.Add("LevelEditor");
 	PrivateDependencyModuleNames.Add("SourceControlWindows");
 	PrivateDependencyModuleNames.Add("ProjectSettingsViewer");
 	PrivateDependencyModuleNames.Add("UnrealEd");
 	PrivateDependencyModuleNames.Add("AssetTools");
 	PrivateDependencyModuleNames.Add("ToolMenus");
        PrivateDependencyModuleNames.Add("Blutility");
 }
注意上面PrivateIncludePaths加入了LevelEditor/Private目录,则包含头文件时应如下:
 #if (ENGINE_MAJOR_VERSION >= 5) && (ENGINE_MINOR_VERSION <= 1)
 #include "LevelEditor/Private/SLevelEditor.h"
 #else
 #include "SLevelEditor.h"
 #endif
同样的还有Classes目录的头文件引用:
 #if (ENGINE_MAJOR_VERSION >= 5) && (ENGINE_MINOR_VERSION <= 1)
 #include "LevelEditor/Private/SLevelEditor.h"
 #include "Blutility/Classes/EditorUtilityWidgetBlueprint.h"
 #else
 #include "EditorUtilityWidgetBlueprint.h"
 #endif

module.build.cs文件常见字段

string path = Path.Combile(p1, p2, p3);
string absolutePath = Path.GetFullPath(path);
//https://docs.unrealengine.com/4.27/en-US/ProductionPipelines/BuildTools/UnrealBuildTool/ThirdPartyLibraries/
RuntimeDependencies.Add(Path.GetFullPath(absolutePath), StagedFileType.NonUFS);
if (Target.bBuildEditor)判断当前build配置是否包含Editor

PublicDependencyModuleNames/PrivateDependencyModuleNames属于静态链接,通常其PublicIncludePaths/PrivateIncludePaths会自行处理正确。
PublicIncludePathModuleNames/PrivateIncludePathModuleNames与DynamicallyLoadedModuleNames配合属于动态链接,因此如果你使用了非抽象函数,则会提示无法找到链接符号。这一对配置的典型用法参考 #474,一般就是LoadModuleChecked,然后调用接口的抽象函数。

关于PublicSystemLibraryPaths,PublicAdditionalLibraries,PublicLibraryPaths的问题

在(<)UE4.24的版本中,指定lib文件的方法跟visual studio里使用的方式一致:
  1. PublicLibraryPaths用于添加lib文件所在的目录
  2. PublicAdditionalLibraries用于添加lib文件,不包括路径信息
引擎寻找lib文件的方式就是将上面这两个选项指定的字符串进行组合拼接,验证拼接后字符串是否为有效路径。这个过程是很慢的,因此从UE4.24版本开始,引擎推荐如下使用方式解决这个问题:
  • 忽略PublicLibraryPaths字段,且PublicAdditionalLibraries字段直接添加lib文件绝对路径。
如果仍坚持老的使用方式,则会报Warning,用以下方式可以消除这个Warning,但并不能消除老的方式的效率低下的问题:
  1. PublicSystemLibraryPaths取代PublicLibraryPaths,用于添加lib文件所在的目录
  2. PublicSystemLibraries来添加库文件,但只需要库的名字即可,不需要后缀。或者直接在cpp中用#pragma comment(lib,"avcodec.lib")这种写法,会从PublicSystemLibraryPaths指定的目录下去寻找

定义宏macro

PublicDefinitions.Add("MacroName=MacroBody");