当前位置:   article > 正文

macOS 更新Xcode,UE4编译C++报错variable “LayerNames” set but not used -Wunused-but-set-variable解决方案

-wunused-but-set-variable

一、背景

本人在一次苹果macOS系统更新(手贱点了一下AppStore里的全部更新)后,发现虚幻引擎UE4.27的C++项目无法编译通过,报错信息为:

  1. variable “LayerNames” set but not used [-Werror,-Wunused-but-set-variable]
  2. const TArray<FText>* LayerNames = &LayersExpression->GetLayerNames();

经过翻查社区资料:

LayerNames error bricking my Mac projects - Platform & Builds - Unreal Engine Forums

外加本人亲自验证,得出如下两种适用于不同用户的解决方案。

二、解决步骤

(〇)降级Xcode为13.2.x

费力不讨好,开倒车的方案在此不做介绍。

---------

(一)为特定项目添加编译参数

该方案无需重新编译引擎的UnrealBuildTool,可以快速解决问题,但缺点是每个项目,以及新建的项目都需要进行设置。适合新手使用。

步骤:

1. 找到项目目录下如下两个文件:
        Source/项目名称Editor.target.cs     --     对应编辑器调试
        Source/项目名称.target.cs    --      对应无编辑器模式

2. 打开上述两个文件,插入两行代码:

  1. bOverrideBuildEnvironment = true; // 打开覆盖编译器参数开关
  2. AdditionalCompilerArguments = "-Wno-unused-but-set-variable"; // 增加编译器参数-Wno-unused-but-set-variable以屏蔽该警告。

最终得到的结果类似于:

  1. // Fill out your copyright notice in the Description page of Project Settings.
  2. using UnrealBuildTool;
  3. using System.Collections.Generic;
  4. public class MyTarget : TargetRules
  5. {
  6. public MyTarget(TargetInfo Target) : base(Target)
  7. {
  8. Type = TargetType.Game;
  9. DefaultBuildSettings = BuildSettingsVersion.V2;
  10. ExtraModuleNames.AddRange( new string[] { "My" } );
  11. // 插入如下两行
  12. bOverrideBuildEnvironment = true; // 打开覆盖编译器参数开关
  13. AdditionalCompilerArguments = "-Wno-unused-but-set-variable"; // 增加编译器参数-Wno-unused-but-set-variable以屏蔽该警告。
  14. }
  15. }

3. 保存,编译,问题解决。

--------

(二)修改UnrealBuildTool配置文件并重新编译引擎的UnrealBuildTool。

方案一的问题在于对于每个新建的项目,都需要重复进行上述操作。对于其他平台发来的项目,也需要额外进行相关配置。

方案二采取直接修改引擎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";

最后的结果类似于:

  1. // ...
  2. if (Options.HasFlag(MacToolChainOptions.EnableUndefinedBehaviorSanitizer))
  3. {
  4. Result += " -fsanitize=undefined";
  5. }
  6. Result += " -Wall -Werror";
  7. Result += " -Wno-unused-but-set-variable"; // 插入的代码
  8. Result += " -Wdelete-non-virtual-dtor";
  9. // clang 12.00 has a new warning for copies in ranged loops. Instances have all been fixed up (2020/6/26) but
  10. // are likely to be reintroduced due to no equivalent on other platforms at this time so disable the warning
  11. if (GetClangVersion().Major >= 12)
  12. {
  13. Result += " -Wno-range-loop-analysis ";
  14. }
  15. // ...

4. 保存文件

5. 编译前准备

虚幻引擎默认安装完成后,会对UnrealBuildTool的相关执行文件设置只读权限,阻碍编译过程,为此,我们需要首先备份并删除如下两个目录(默认位置):

  1. /Users/Shared/Epic Games/UE_4.27/Engine/Source/Programs/UnrealBuildTool/obj/Development
  2. /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版本升级说明内查到,欢迎大佬补充。

希望本帖对各位有所帮助。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/159825
推荐阅读
相关标签
  

闽ICP备14008679号