一、背景
本人在一次蘋果macOS系統(tǒng)更新(手賤點(diǎn)了一下AppStore里的全部更新)后,發(fā)現(xiàn)虛幻引擎UE4.27的C++項(xiàng)目無(wú)法編譯通過,報(bào)錯(cuò)信息為:
variable “LayerNames” set but not used [-Werror,-Wunused-but-set-variable]
const TArray<FText>* LayerNames = &LayersExpression->GetLayerNames();
經(jīng)過翻查社區(qū)資料:
LayerNames error bricking my Mac projects - Platform & Builds - Unreal Engine Forums
外加本人親自驗(yàn)證,得出如下兩種適用于不同用戶的解決方案。
二、解決步驟
(〇)降級(jí)Xcode為13.2.x
費(fèi)力不討好,開倒車的方案在此不做介紹。
---------
(一)為特定項(xiàng)目添加編譯參數(shù)
該方案無(wú)需重新編譯引擎的UnrealBuildTool,可以快速解決問題,但缺點(diǎn)是每個(gè)項(xiàng)目,以及新建的項(xiàng)目都需要進(jìn)行設(shè)置。適合新手使用。
步驟:
1. 找到項(xiàng)目目錄下如下兩個(gè)文件:
? ? ? ? Source/項(xiàng)目名稱Editor.target.cs? ? ?--? ? ?對(duì)應(yīng)編輯器調(diào)試
????????Source/項(xiàng)目名稱.target.cs? ? --? ? ? 對(duì)應(yīng)無(wú)編輯器模式
2. 打開上述兩個(gè)文件,插入兩行代碼:
bOverrideBuildEnvironment = true; // 打開覆蓋編譯器參數(shù)開關(guān)
AdditionalCompilerArguments = "-Wno-unused-but-set-variable"; // 增加編譯器參數(shù)-Wno-unused-but-set-variable以屏蔽該警告。
最終得到的結(jié)果類似于:
// 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; // 打開覆蓋編譯器參數(shù)開關(guān)
AdditionalCompilerArguments = "-Wno-unused-but-set-variable"; // 增加編譯器參數(shù)-Wno-unused-but-set-variable以屏蔽該警告。
}
}
3. 保存,編譯,問題解決。
--------
(二)修改UnrealBuildTool配置文件并重新編譯引擎的UnrealBuildTool。
方案一的問題在于對(duì)于每個(gè)新建的項(xiàng)目,都需要重復(fù)進(jìn)行上述操作。對(duì)于其他平臺(tái)發(fā)來的項(xiàng)目,也需要額外進(jìn)行相關(guān)配置。
方案二采取直接修改引擎UnrealBuildTool的方式,可以在該機(jī)器上一勞永逸解決問題,缺點(diǎn)是相比之下更加麻煩,但是磨刀不誤砍柴嘛!
步驟:
1. 定位配置文件MacToolChain.cs??梢圆捎弥苯铀阉鞯姆绞蕉ㄎ?,或者如果在默認(rèn)安裝位置查找:
/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";
最后的結(jié)果類似于:
// ...
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. 編譯前準(zhǔn)備
虛幻引擎默認(rèn)安裝完成后,會(huì)對(duì)UnrealBuildTool的相關(guān)執(zhí)行文件設(shè)置只讀權(quán)限,阻礙編譯過程,為此,我們需要首先備份并刪除如下兩個(gè)目錄(默認(rèn)位置):
/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
?找到這兩個(gè)目錄并改名為Development.bak之類的即可。
6. 重新編譯UnrealBuildTool
由于本人對(duì)C#項(xiàng)目在macOS下的編譯過程并不熟悉,這里直接使用了JetBrains的跨平臺(tái)C# IDE,這里也是非常推薦平時(shí)在虛幻引擎C++開發(fā)過程中使用的Rider來進(jìn)行編譯。
6.1 首先找到UnrealBuildTool的項(xiàng)目描述文件:UnrealBuildTool.csproj,默認(rèn)位于:
/Users/Shared/Epic Games/UE_4.27/Engine/Source/Programs/UnrealBuildTool/UnrealBuildTool.csproj
6.2 使用Rider打開該文件:
?6.3 點(diǎn)擊扳手按鈕開始編譯項(xiàng)目
6.4 數(shù)十秒后提示編譯成功。如果報(bào)權(quán)限錯(cuò)誤,請(qǐng)回頭看 5-編譯前準(zhǔn)備。
?完成!
三、原因推斷
推測(cè)是因?yàn)閄code13.3版本將
unused-but-set-variable
這個(gè)warnning選項(xiàng)列為-Wall -Werror的考慮范疇了,而此前版本未在該范疇。
該推測(cè)尚未在Xcode版本升級(jí)說明內(nèi)查到,歡迎大佬補(bǔ)充。文章來源:http://www.zghlxwxcb.cn/news/detail-400236.html
希望本帖對(duì)各位有所幫助。文章來源地址http://www.zghlxwxcb.cn/news/detail-400236.html
到了這里,關(guān)于macOS 更新Xcode,UE4編譯C++報(bào)錯(cuò)variable “LayerNames” set but not used -Wunused-but-set-variable解決方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!