UE5 不同的编译模式下,module的组织形式

由于最近在琢磨UE5.4这个引擎,在学习过程中,碰到了一些非常有意思的事情,我在尝试把之前写的一些底层库搬到UE里面,比如底层库,网络库等等,我通过建立module,将这些库用源代码的方式整合进了UE5,因为我一直认为整体编译可以更方便的更改编译条件,因此都是用源代码的方式,比如一个atom的库,编译的C#脚本如下:

// Copyright Epic Games, Inc. All Rights Reserved.

using System.IO;
using UnrealBuildTool;

public class atom : ModuleRules
{
	public atom(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;

        PublicIncludePaths.AddRange(
			new string[] {
				// ... add public include paths required here ...
            }
			);
				
		
		PrivateIncludePaths.AddRange(
			new string[] {
				// ... add other private include paths required here ...
			}
			);
			
		
		PublicDependencyModuleNames.AddRange(
			new string[]
			{
				//"Core",
				// ... add other public dependencies that you statically link with here ...
			}
			);
			
		
		PrivateDependencyModuleNames.AddRange(
			new string[]
			{
				 //"CoreUObject",
				 //"Engine",
				// "Slate",
				// "SlateCore",
				// ... add private dependencies that you statically link with here ...	
			}
			);
		
		
		DynamicallyLoadedModuleNames.AddRange(
			new string[]
			{
				// ... add any modules that your module loads dynamically here ...
			}
			);
    }
}

非常的简单,甚至屏蔽了所有依赖。 然后在入口的module引用这个库。其编译脚本如下:

// Copyright Epic Games, Inc. All Rights Reserved.

using System.IO;
using UnrealBuildTool;

public class Portal : ModuleRules
{
	public Portal(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;


        PublicIncludePaths.AddRange(
			new string[] {
				// ... add public include paths required here ...
                "atom/code",
            }
            );
				
		
		PrivateIncludePaths.AddRange(
			new string[] {
				// ... add other private include paths required here ...
			}
			);
			
		
		PublicDependencyModuleNames.AddRange(
			new string[]
			{
				"Core",
				// ... add other public dependencies that you statically link with here ...
				"atom"
			}
			);
			
		
		PrivateDependencyModuleNames.AddRange(
			new string[]
			{
				"CoreUObject",
				"Engine",
				"Slate",
				"SlateCore",
				// ... add private dependencies that you statically link with here ...	
			}
			);
		
		
		DynamicallyLoadedModuleNames.AddRange(
			new string[]
			{
				// ... add any modules that your module loads dynamically here ...
			}
			);

    }
}

然后在public dependcy里面将该库引入。这样,就可以编译了。

但是问题来了,这个方法只适合客户端模式,不适合编辑器模式!因为客户端可以用静态库,而编辑器模式需要的是动态库。编辑器模式下甚至打不开编辑器。告诉我atom的dll不存在。

这个非常的坑,我想了很多办法都没有办法兼容两种模式。

后来,迫不得已,我只能将这个atom库改成静态库,不参与编译。其新的编译脚本如下:

// Copyright Epic Games, Inc. All Rights Reserved.

using System.IO;
using UnrealBuildTool;

public class atom : ModuleRules
{
	public atom(ReadOnlyTargetRules Target) : base(Target)
	{
		//PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;

        Type = ModuleType.External;

        PublicIncludePaths.AddRange(
			new string[] {
				// ... add public include paths required here ...
            }
			);
				
		
		PrivateIncludePaths.AddRange(
			new string[] {
				// ... add other private include paths required here ...
			}
			);
			
		
		PublicDependencyModuleNames.AddRange(
			new string[]
			{
				//"Core",
				// ... add other public dependencies that you statically link with here ...
			}
			);
			
		
		PrivateDependencyModuleNames.AddRange(
			new string[]
			{
				 //"CoreUObject",
				 //"Engine",
				// "Slate",
				// "SlateCore",
				// ... add private dependencies that you statically link with here ...	
			}
			);
		
		
		DynamicallyLoadedModuleNames.AddRange(
			new string[]
			{
				// ... add any modules that your module loads dynamically here ...
			}
			);

        PublicAdditionalLibraries.Add(Path.Combine(ModuleDirectory, "lib", "x64", "atom_Debug.lib"));
    }
}

主要是将module的类型改成External,不参与编译,同时准备好这个库的静态库。

然后入口module的编译脚本如下:

// Copyright Epic Games, Inc. All Rights Reserved.

using System.IO;
using UnrealBuildTool;

public class Portal : ModuleRules
{
	public Portal(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;


        PublicIncludePaths.AddRange(
			new string[] {
				// ... add public include paths required here ...
                "atom/code",
            }
            );
				
		
		PrivateIncludePaths.AddRange(
			new string[] {
				// ... add other private include paths required here ...
			}
			);
			
		
		PublicDependencyModuleNames.AddRange(
			new string[]
			{
				"Core",
				// ... add other public dependencies that you statically link with here ...
				"atom",


			}
			);
			
		
		PrivateDependencyModuleNames.AddRange(
			new string[]
			{
				"CoreUObject",
				"Engine",
				"Slate",
				"SlateCore",
				// ... add private dependencies that you statically link with here ...	
			}
			);
		
		
		DynamicallyLoadedModuleNames.AddRange(
			new string[]
			{
				// ... add any modules that your module loads dynamically here ...
			}
			);

    }
}

这个地方引入了静态库,再编译,就可以再客户端模式和编辑器模式下一同生效。

### Unreal Engine 5 C++ 编译错误的原因与解决方案 在使用 Unreal Engine 5UE5)进行 C++ 开发时,用户可能会遇到各种编译错误。这些错误通常与开发环境配置、依赖项缺失或版本兼容性有关。 #### 常见错误示例:`NETSDK1004 找不到资产文件` 此错误表明项目缺少必要的 NuGet 包依赖文件 `project.assets.json`,通常是由于未正确还原 NuGet 包引起的。该问题可能出现在使用较新版本的 .NET SDK 或者 Visual Studio 配置不完整的情况下。 **解决方案:** - **运行 NuGet 包还原**:确保在 Visual Studio 中启用 NuGet 包还原功能,或者通过命令行执行 `nuget restore` 来恢复缺失的依赖项。 - **检查 .NET SDK 版本**:确保安装的 .NET SDK 版本与 UE5 兼容。某些 UE5 版本可能需要特定版本的 .NET SDK 支持,建议参考官方文档确认推荐版本。 - **更新 Visual Studio**:使用最新版本的 Visual Studio 2022 可以避免许多与 .NET 相关的问题,因为旧版本(如 VS2017)不支持某些现代 .NET 功能[^3]。 #### 常见错误示例:`The specified framework ‘Microsoft.AspNetCore.App’, version ‘3.1.0’ was not found` 此错误通常发生在尝试使用不兼容的 .NET 运行时版本时,例如在未安装 .NET Core 3.1 的系统上构建依赖于该框架的项目。 **解决方案:** - **安装 .NET Core 3.1 SDK**:从 [.NET 官方网站](https://dotnet.microsoft.com/download/dotnet-core/3.1) 下载并安装 .NET Core 3.1 SDK。 - **升级 Visual Studio**:如果使用的是 Visual Studio 2017 或更早版本,建议升级到 Visual Studio 2019 或更高版本,以获得对 .NET Core 3.1 的完整支持[^3]。 #### 一般性建议 - **确保引擎和工具链匹配**:Unreal Engine 对使用的 Visual Studio 和 Windows SDK 有特定要求。例如,UE5 推荐使用 Visual Studio 2022 和 Windows SDK 10.0.20348.0 或更高版本。 - **清理并重新生成项目**:有时,旧的中间文件可能导致构建失败。可以尝试删除 `Intermediate` 和 `Saved` 文件夹后重新生成项目。 - **启用调试信息**:在构建过程中启用详细输出可以帮助定位具体问题。可以通过修改 `BuildConfiguration.xml` 文件来调整日志级别。 ### 示例代码:修复编译器路径问题 如果你在构建过程中遇到路径相关的问题,可以尝试手动设置编译器路径: ```cpp // 在 Build.cs 文件中指定编译器路径(可选) public class MyProject : ModuleRules { public MyProject(ReadOnlyTargetRules Target) : base(Target) { PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" }); // 设置自定义编译器参数(如有必要) bUseRTTI = true; } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值