本人在一次苹果macOS系统更新(手贱点了一下AppStore里的全部更新)后,发现虚幻引擎UE4.27的C++项目无法编译通过,报错信息为:
variable “LayerNames” set but not used [-Werror,-Wunused-but-set-variable]
const TArray* 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.4 数十秒后提示编译成功。如果报权限错误,请回头看 5-编译前准备。
完成!
推测是因为Xcode13.3版本将
unused-but-set-variable
这个warnning选项列为-Wall -Werror的考虑范畴了,而此前版本未在该范畴。
该推测尚未在Xcode版本升级说明内查到,欢迎大佬补充。
希望本帖对各位有所帮助。