赞
踩
本人在一次苹果macOS系统更新(手贱点了一下AppStore里的全部更新)后,发现虚幻引擎UE4.27的C++项目无法编译通过,报错信息为:
- variable “LayerNames” set but not used [-Werror,-Wunused-but-set-variable]
- const TArray<FText>* LayerNames = &LayersExpression->GetLayerNames();
经过翻查社区资料:
LayerNames error bricking my Mac projects - Platform & Builds - Unreal Engine Forums
外加本人亲自验证,得出如下两种适用于不同用户的解决方案。
费力不讨好,开倒车的方案在此不做介绍。
---------
该方案无需重新编译引擎的UnrealBuildTool,可以快速解决问题,但缺点是每个项目,以及新建的项目都需要进行设置。适合新手使用。
步骤:
1. 找到项目目录下如下两个文件:
Source/项目名称Editor.target.cs -- 对应编辑器调试
Source/项目名称.target.cs -- 对应无编辑器模式
2. 打开上述两个文件,插入两行代码:
- bOverrideBuildEnvironment = true; // 打开覆盖编译器参数开关
- AdditionalCompilerArguments = "-Wno-unused-but-set-variable"; // 增加编译器参数-Wno-unused-but-set-variable以屏蔽该警告。
最终得到的结果类似于:
- // Fill out your copyright notice in the Description page of Project Settings.
-
- using UnrealBuildTool;
- using System.Collections.Generic;
-
- public class MyTarget : TargetRules
- {
- public MyTarget(TargetInfo Target) : base(Target)
- {
- Type = TargetType.Game;
- DefaultBuildSettings = BuildSettingsVersion.V2;
-
- ExtraModuleNames.AddRange( new string[] { "My" } );
-
- // 插入如下两行
- bOverrideBuildEnvironment = true; // 打开覆盖编译器参数开关
- AdditionalCompilerArguments = "-Wno-unused-but-set-variable"; // 增加编译器参数-Wno-unused-but-set-variable以屏蔽该警告。
- }
- }
3. 保存,编译,问题解决。
--------
方案一的问题在于对于每个新建的项目,都需要重复进行上述操作。对于其他平台发来的项目,也需要额外进行相关配置。
方案二采取直接修改引擎UnrealBuildTool的方式,可以在该机器上一劳永逸解决问题,缺点是相比之下更加麻烦,但是磨刀不误砍柴嘛!
步骤:
1. 定位配置文件MacToolChain.cs。可以采用直接搜索的方式定位,或者如果在默认安装位置查找:
/Users/Shared/Epic Games/UE_4.27/Engine/Source/Programs/UnrealBuildTool/Platform/Mac/MacToolChain.cs
2. 打开该文件,查找如下代码:
Result += " -Wall -Werror";
3. 在上面代码下面插入一行代码:
Result += " -Wno-unused-but-set-variable";
最后的结果类似于:
- // ...
- if (Options.HasFlag(MacToolChainOptions.EnableUndefinedBehaviorSanitizer))
- {
- Result += " -fsanitize=undefined";
- }
-
- Result += " -Wall -Werror";
- Result += " -Wno-unused-but-set-variable"; // 插入的代码
- Result += " -Wdelete-non-virtual-dtor";
-
- // clang 12.00 has a new warning for copies in ranged loops. Instances have all been fixed up (2020/6/26) but
- // are likely to be reintroduced due to no equivalent on other platforms at this time so disable the warning
- if (GetClangVersion().Major >= 12)
- {
- Result += " -Wno-range-loop-analysis ";
- }
- // ...
4. 保存文件
5. 编译前准备
虚幻引擎默认安装完成后,会对UnrealBuildTool的相关执行文件设置只读权限,阻碍编译过程,为此,我们需要首先备份并删除如下两个目录(默认位置):
- /Users/Shared/Epic Games/UE_4.27/Engine/Source/Programs/UnrealBuildTool/obj/Development
- /Users/Shared/Epic Games/UE_4.27/Engine/Source/Programs/DotNETCommon/DotNETUtilities/obj/Development
找到这两个目录并改名为Development.bak之类的即可。
6. 重新编译UnrealBuildTool
由于本人对C#项目在macOS下的编译过程并不熟悉,这里直接使用了JetBrains的跨平台C# IDE,这里也是非常推荐平时在虚幻引擎C++开发过程中使用的Rider来进行编译。
6.1 首先找到UnrealBuildTool的项目描述文件:UnrealBuildTool.csproj,默认位于:
/Users/Shared/Epic Games/UE_4.27/Engine/Source/Programs/UnrealBuildTool/UnrealBuildTool.csproj
6.2 使用Rider打开该文件:
6.3 点击扳手按钮开始编译项目
6.4 数十秒后提示编译成功。如果报权限错误,请回头看 5-编译前准备。
完成!
推测是因为Xcode13.3版本将
unused-but-set-variable
这个warnning选项列为-Wall -Werror的考虑范畴了,而此前版本未在该范畴。
该推测尚未在Xcode版本升级说明内查到,欢迎大佬补充。
希望本帖对各位有所帮助。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。