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

〇、2024-04-08更新

本文的方案不仅适用于报错内容包含:-Werror -Wused-but-set-variable报错,还适用于所有类似的报错,只要在对应位置加上-Wno-xxx(xxx!=error)即可。例如截至2024-04-08新增的如下报错:

-Werror,-Wbitwise-instead-of-logical

-Werror,-Wdeprecated-builtins

-Werror,-Wsingle-bitfield-constant-conversion

例如方案1中可以为:

bOverrideBuildEnvironment = true;  // 打开覆盖编译器参数开关

// 增加编译器参数-Wno-unused-but-set-variable以屏蔽该警告。后面的为2024-04-08之前更新的其他参数
AdditionalCompilerArguments = "-Wno-unused-but-set-variable " 
                            + "-Wno-bitwise-instead-of-logical " 
                            + "-Wno-deprecated-builtins "
                            + "-Wno-single-bit-bitfield-constant-conversion";

方案2中可以为:


			Result += " -Wall -Werror";

            // 以下为新增代码
			Result += " -Wno-unused-but-set-variable";
            // 至2024-04-08更新的内容
			Result += " -Wno-bitwise-instead-of-logical";
			Result += " -Wno-deprecated-builtins";
			Result += " -Wno-single-bit-bitfield-constant-conversion";

一、背景

本人在一次苹果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

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

二、解决步骤

(〇)降级Xcode为13.2.x

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

---------

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

该方案无需重新编译引擎的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配置文件并重新编译引擎的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";

最后的结果类似于:

// ...
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版本升级说明内查到,欢迎大佬补充。

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

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值