UE4
oga at 00:17
Ryzen 9 3950X は 16 core 32 thread の CPU です。少し前まで 4 core 8 thread の CPU をメインに使っていたことを考えると、これ 1つで従来の PC の 4台分に相当します。

実際に速度を調べてみました。UE4 のコンパイル速度の比較は下記の通り。本当に 4台分、コンパイル時間が 1/4になっています。

● UE4 4.24.0 (GitHub版) の Engine コンパイル時間

CPU Core Thread Build 時間 (A) Build 時間 (B)
Ryzen 9 3950X Zen2 16C/32T 966 (16:06) 833 (13:53)
Ryzen 7 1800X Zen 8C/16T 2481 (41:21) 2240 (37:20)
Core i7-6700K Skylake 4C/8T 3787 (63:07) 3564 (59:24)

・Build 時間の単位は秒、値が小さい方が高速

Skylake Core i7-6700K で 1時間かかるビルドが Ryzen 9 3950X だと 16分で終わっています。4倍高速です。1800X と比べても 2.5倍速くなっています。これくらい速ければ分散ビルドなしで十分使えそうです。

ちなみに条件を統一するため 3台とも SATA 接続の SSD の上でビルドしています。NVMe ならもっと時間を短縮できると思われます。


・(A) は Total のビルド時間で UnrealHeaderTool と ShaderCompileWorker が含まれています。また UHT のヘッダ生成は並列化されないためシングルスレッドの時間が含まれます。

・(B) は Engine の ParallelExecutor だけの時間で、最後の Link 以外は並列化されています。シングルスレッドの時間が短いため (A) よりも Thread 数の差が出やすくなります。

・一旦 clean してから Engine\Build\BatchFiles\Build.bat を使い DevelopmentEditor Win64 でビルドしています。

Ryzen9

Ryzen9
↑16 core でも小さい Socket AM4。箱の中身は殆どが黒いスポンジ。


● ARM デバイスの比較に使っているコンパイルベンチの速度

CPU Core Clock Thread Build 時間 WSL
Ryzen 9 3950X Zen2 3.5 GHz 16C/32T 10 (00:10)
Ryzen 7 1800X Zen 3.6 GHz 8C/16T 26 (00:26)
Core i7-6700K Skylake 4.0 GHz 4C/8T 40 (00:40)
Core i7-4790K Haswell 4.0 GHz 4C/8T 41 (00:41)

・Build 時間の単位は秒、値が小さい方が高速

これも UE4 とほぼ同じで 4倍速くなっています。詳しくはこちら


● vfpbench の結果

CPU Thread Single-Thread Multi-Thread
Ryzen 9 3950X 16C/32T 123.3 GFLOPS 1898.0 GFLOPS
Ryzen 7 1800X 8C/16T 61.4 GFLOPS 476.2 GFLOPS
Core i7-6700K 4C/8T 135.6 GFLOPS 542.3 GFLOPS

・GFLOPS の値が大きい方が高速。単精度のみ。

1.9 TFLOPS (1898 GFLOPS) という見たことがない数値が出ました。あくまでメモリアクセスを無視した理想的な条件での値です。だいたい PS4 の GPU に相当します。実際のアプリケーションでこの速度が出るわけではないので参考程度にお願いします。

下記は計測結果のログです。Single Thread 単精度のみ。倍精度はまだ調査中です。

Group 0:  Thread=32  Clock=3.493000 GHz  (mask:ffffffff)
  SingleThread HP max: -
  SingleThread SP max:  122.851 GFLOPS
  SingleThread DP max:   52.722 GFLOPS
  MultiThread  HP max: -
  MultiThread  SP max: 1894.097 GFLOPS
  MultiThread  DP max:  954.959 GFLOPS

* Group 0:  Thread=1  Clock=3.493000 GHz
                                  TIME(s)   MFLOPS      MOPS    FOP IPC
SSE mulss (32bit x1) n8       :    0.244     8605.0     8605.0 (  1 2.5)
SSE addss (32bit x1) n8       :    0.244     8591.2     8591.2 (  1 2.5)
FMA vfmaddss (32bit x1) n8    :    0.317    13239.6     6619.8 (  2 1.9)
FMA vfmaddss (32bit x1) n12   :    0.365    17246.0     8623.0 (  2 2.5)
SSE mulps (32bit x4) n8       :    0.245    34194.1     8548.5 (  4 2.4)
SSE addps (32bit x4) n8       :    0.243    34520.1     8630.0 (  4 2.5)
SSE mul+addps (32bit x4) n8   :    0.183    45837.4    11459.3 (  4 3.3)
FMA vfmaddps (32bit x4) n8    :    0.303    55334.8     6916.9 (  8 2.0)
FMA vfmaddps (32bit x4) n12   :    0.364    69104.3     8638.0 (  8 2.5)
SSE ml+ad+adps (32bit x4) n9  :    0.218    43313.8    10828.4 (  4 3.1)
SSE mulss (32bit x1) ns4      :    0.368     5699.9     5699.9 (  1 1.6)
SSE addss (32bit x1) ns4      :    0.368     5698.4     5698.4 (  1 1.6)
SSE mulps (32bit x4) ns4      :    0.367    22812.0     5703.0 (  4 1.6)
SSE addps (32bit x4) ns4      :    0.366    22916.4     5729.1 (  4 1.6)
AVX vmulps (32bit x8) n8      :    0.258    65052.1     8131.5 (  8 2.3)
AVX vaddps (32bit x8) n8      :    0.260    64581.5     8072.7 (  8 2.3)
AVX vmul+addps (32bit x8) n8  :    0.157   106474.3    13309.3 (  8 3.8)
FMA vfmaddps (32bit x8) n8    :    0.318   105391.7     6587.0 ( 16 1.9)
FMA vfmaddps (32bit x8) n12   :    0.408   123302.0     7706.4 ( 16 2.2)
FMA vfma+mlps (32bit x8) n12  :    0.408    92570.0     7714.2 ( 12 2.2)
FMA vfma+adps (32bit x8) n12  :    0.345   109457.1     9121.4 ( 12 2.6)
AVX vml+ad+adps (32bit x8) n9 :    0.345    54644.5     6830.6 (  8 2.0)
FMA vfma+ml+adps (32bit x8) n9:    0.307    81930.4     8193.0 ( 10 2.3)


関連ページ
Compile Benchmark
VFP Benchmark Log 計測結果まとめ

関連エントリ
UE4 UnrealBuildTool の設定 BuildConfiguration.xml
UE4 UnrealBuildTool VisualStudio の選択を行う
UE4 UnrealBuildTool *.Build.cs のコードを共有する
AMD CPU Ryzen とコンパイル時間の比較 (2)
AMD CPU Ryzen とコンパイル時間の比較


UE4
oga at 20:26
UE4 のビルドツール UnrealBuildTool はビルドファイルの定義に *.Target.cs や *.Build.cs を使います。それとは別に、デフォルトパラメータを定義できる BuildConfiguration.xml があります。

UE4 Programming Guide / BuildTools / UnrealBuildTool / Build Configuration

例えば次の内容で BuildConfiguration.xml を作り、Documents のフォルダ "Unreal Engine\UnrealBuildTool" に入れておくと UnityBuild を無効化することができます。

<?xml version="1.0" encoding="utf-8"?>
<Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
        <BuildConfiguration>
                <bUseUnityBuild>false</bUseUnityBuild>
        </BuildConfiguration>
</Configuration>

※ UnityBuild を off にするとビルドが極端に遅くなるのでお勧めしません。

BuildConfiguration.xml のチェックが行われている場所は以下の 4 つです。

(1) Engine\Programs\NotForLicensees\UnrealBuildTool\BuildConfiguration.xml
(2) Engine\Saved\UnrealBuildTool\BuildConfiguration.xml
(3) C:\Users\<USERNAME>\AppData\Roaming\Unreal Engine\UnrealBuildTool\BuildConfiguration.xml
(4) C:\Users\<USERNAME>\Documents\Unreal Engine\UnrealBuildTool\BuildConfiguration.xml

この順番で読み込まれるため、下の方が優先順位が高くなります。

(3), (4) はすべてのエンジンに対して有効になります。UE4 のバージョンによって設定項目に若干違いがあるので、複数のエンジンを併用している場合は注意が必要です。エンジンによってエラーが出る場合は (2) のようにエンジン毎のフォルダに入れておいた方が良いかもしれません。

たとえば ProcessorCountMultiplier は UE4 4.20 までは BuildConfiguration に含まれていました。4.21 では無くなっており、代わりに Executor 毎の個別パラメータを使うようになっています。

UE4 4.20 の場合

<?xml version="1.0" encoding="utf-8"?>
<Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
        <BuildConfiguration>
                <ProcessorCountMultiplier>2.0</ProcessorCountMultiplier>
        </BuildConfiguration>
</Configuration>



UE4 4.21 の場合

<?xml version="1.0" encoding="utf-8"?>
<Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
        <LocalExecutor>
                <ProcessorCountMultiplier>2.0</ProcessorCountMultiplier>
        </LocalExecutor>
        <ParallelExecutor>
                <ProcessorCountMultiplier>1.0</ProcessorCountMultiplier>
        </ParallelExecutor>
</Configuration>

ParallelExecutor は 4.21 で新しく追加されたものです。以前の LocalExecutor も残っていますが、分散ビルドを使わない場合 4.21 以降はデフォルトが ParallelExecutor になります。

LocalExecutor の場合、4 core 8 thread の CPU ではデフォルトでビルドに 4 thread 使います。ProcessorCountMultiplier を 2.0 にすると 8 thread 全部使うようになります。8 core 16 thread の CPU ではなぜかデフォルトで 12 thread、ProcessorCountMultiplier を 2.0 にすると 16 thread になります。計算が合わないように見えるのは、5 core 以上で計算式が変わるからです。

// UBT LocalExecutor の計算式
if( ProcessorCountMultiplier == 1.0 ){
   if( Core数 > 4 ){
       ビルドに使う thread 数 = ( Core数 + Thread数 ) / 2;
   }else{
       ビルドに使う thread 数 = Core数;
   }
}else{
   ビルドに使う thread 数 = Core数 * ProcessorCountMultiplier;
}

4.21 から追加された ParallelExecutor では特に ProcessorCountMultiplier を設定しなくても、最初からハードウエアと一致する 8 thread や 16 thread でビルドが行われています。まとめると下記の通り。


Executor LocalExecutor ParallelExecutor
Multiplier 1.0 2.0 1.0 2.0
Skylake i7-6700K ( 4C8T ) 4 8 8 16
CoffeeLake i7-8700K ( 6C12T ) 9 12 12 24
Ryzen 7 1800X ( 8C16T ) 12 16 16 32

つまり以前の LocalExecutor の場合、ProcessorCountMultiplier = 2.0 は効率を上げるために有効でしたが、ParallelExecutor では本来の倍のスレッドが走ってしまいます。古い設定を継承するとスレッド数が過剰になるため BuildConfiguration から削除されたのかもしれません。ちなみに ParallelExecutor は下記の設定で無効化できます。

<?xml version="1.0" encoding="utf-8"?>
<Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
        <BuildConfiguration>
                <bAllowParallelExecutor>false</bAllowParallelExecutor>
        </BuildConfiguration>
</Configuration>

このように UnrealBuildTool には様々な設定があります。オプションの種類は下記のファイルを見るとわかります。

Engine\Saved\UnrealBuildTool\BuildConfiguration.Schema.xsd

このファイルを見ると UE4 4.22 からは cpp のオプションが増えている事がわかります。下記のような設定もできるようになりました。

<?xml version="1.0" encoding="utf-8"?>
<Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
        <BuildConfiguration>
                <CppStandard>Cpp14</CppStandard>
        </BuildConfiguration>
</Configuration>


関連エントリ
UE4 UnrealBuildTool VisualStudio の選択を行う
UE4 UnrealBuildTool *.Build.cs のコードを共有する


UE4
oga at 19:35
UE4 で C++ プロジェクトを作ると VisualStudio 用のプロジェクトファイル *.vcxproj や *.sln も自動的に作られます。ただしこれらのファイルは UE4 のビルドシステムにとっては必ずしも必要ではなく、IDE を使うための中間ファイルとみなされています。そのため IDE プロジェクトファイルは Git や Perforce には登録されず、必要になったタイミングで作り直します。

VisualStudio プロジェクトファイルを作るには *.uproject ファイルの関連付けを利用するのが最も簡単です。*.uproject ファイルの上で右クリックして "Generate Visual Studio Project files" を選択します。

このとき呼ばれているツールは UnrealVersionSelector.exe です。内部で UnrealBuildTool を呼び出しているのですが、UnrealVersionSelector 経由だとあまり細かいオプション指定ができないようです。

オプション指定を行う場合は、直接 UnrealBuildTool を呼び出すか、またはソースコード版 Engine の GeneratedProjectFiles.bat を使うことができます。


●任意の VisualStudio のバージョンを指定して Project File を作る

UnrealBuildTool や GeneratedProjectFiles.bat を使うと、使用する VisualStudio のバージョンを指定することができます。*.uproject への関連付けも不要ですし、複数のバージョンの VisualStudio をインストールしている場合に便利です。

例えば UE4 4.21 で VisualStudio 2015 を使う場合下記のように "-2015" オプションを指定します。

set ENGINE_PATH=c:\Program Files\Epic Games\UE_4.21

"%ENGINE_PATH%\Engine\Binaries\DotNET\UnrealBuildTool.exe" -projectfiles -project=c:/ue/MyProject421/MyProject421.uproject -game -engine -progress -2015

*.uproject ファイルはフルパスで指定する必要があるので注意。

GitHub のソースコード版を使っている場合は GeneratedProjectFiles.bat を使って同じことができます。

set ENGINE_PATH=c:\ue\4.21.0

%ENGINE_PATH%\GeneratedProjectFiles.bat -project=c:/ue/MyProject421/MyProject421.uproject -game -engine -progress -2015

同様に -2017 や -2019 (4.22 以降) もあります。↓ 4.22 で 2019 を使う場合の例。

c:\ue\4.22.0\Engine\GeneratedProjectFiles.bat -project=c:/ue/MyProject422/MyProject422.uproject -game -engine -progress -2019

ソースコード版エンジンそのものをビルドする場合は GeneratedProjectFiles.bat に -2017 や -2019 などのオプションをつけるだけで OK です。

c:\ue\4.22.0\GeneratedProjectFiles.bat -2019


●プロジェクトファイルの Platform 数を制限する

プロジェクトファイルを作るときに、-platforms オプションを与えておくと不要な Platform を除外してくれます。例えば Win64 と Android だけ含めたい場合は "-platforms=Win64+Android" になります。プロジェクトファイルが小さくなるので、VisualStudio での読み込みが若干速くなります。

set ENGINE_PATH=c:\ue\4.21.0

%ENGINE_PATH%\Engine\Binaries\DotNET\UnrealBuildTool.exe -projectfiles -project=c:/ue/MyProject421/MyProject421.uproject -game -engine -progress -2015 -platforms=Win64


●ビルド時に直接コンパイラのバージョンを指定する

UE4 のビルドは UnrealBuildTool が行います。IDE も UnrealBuildTool を呼び出しているだけなので、直接ビルドすることもできます。この場合も -2015 や -2017 等のオプション指定ができます。

set ENGINE_PATH=c:\ue\4.21.0

%ENGINE_PATH%\Engine\Build\BatchFiles\Build.bat MyProject421Editor Win64 Development -project=c:/ue/MyProject421/MyProject421.uproject -2015

最初の引数 "MyProject421Editor" は、ビルド対象の *.Target.cs を意味しています。"MyProject421Editor" は MyProject421Editor.Target.cs を選択します。Editor なしでビルドしたい場合は MyProject421 です。

4.21 と 4.22 では若干引数が変わっているので、直接 UnrealBuildTool.exe を呼び出すよりは Build.bat や Rebuild.bat を使った方がおそらく安全でしょう。

どのようなコマンドライン引数でビルドが行われているのか VisualStudio のプロパティからも確認できるので、うまくビルドできない場合は確認してみることをおすすめします。


関連エントリ
UE4 UnrealBuildTool *.Build.cs のコードを共有する


UE4
oga at 19:18
UE4 は C# で書かれた独自のビルドシステム UnrealBuildTool を使用しています。Makefile に相当するのが Module 毎に用意する *.Build.cs ファイルです。

例えば GameProject/Source/GameModule をビルドする場合下記のようなファイルを作ります。

// GameProject/Source/GameModule/GameModule.Build.cs
using  UnrealBuildTool;

namespace UnrealBuildTool.Rules
{
    public class GameModule : ModuleRules {
        public GameModule( ReadOnlyTargetRules Target ) : base( Target )
        {
        }
    }
}

この中で依存モジュールの宣言や、外部ライブラリの path 追加などさまざまな設定を行うことができます。

*.Build.cs の他に Project 全体の設定を記述する *.Target.cs もあります。

*.Build.cs Module 毎のビルド設定
*.Target.cs Project 全体のビルド設定

Target.cs はあくまで Project 単位に用意するため Plugin にはありません。また Build 対象に応じて Target.cs が変わるため複数存在します。

~.Target.cs Game
~Editor.Target.cs Editor
~Server.Target.cs Server
~Client.Target.cs Client


●他の Module を参照する場合

UE4 内部の Module 同士の依存関係は Module 名で管理されています。そのため Module については個別に Include path を与えたり Link するライブラリを指定する必要がありません。

例えば依存ファイルとして下記のような宣言を行えば、それぞれの Module への include も Link する Lib も自動で管理してくれます。

PublicDependencyModuleNames.AddRange( new string[] {
        "Core",
        "CoreUObject",
        "Engine",
        "Projects",
    });

Public と Private の違いはわかりにくいですが、依存している Module の Include path を追加するかどうかの違いとなります。

例えば GameModule を参照している他の MainModule があったとします。

// GameModule.Build.cs
using  UnrealBuildTool;

namespace UnrealBuildTool.Rules
{
    public class GameModule : ModuleRules {
        public GameModule( ReadOnlyTargetRules Target ) : base( Target )
        {
            PublicDependencyModuleNames.AddRange( new string[] {
                    "Core",
                });
        }
    }
}

// MainModule.Build.cs
using  UnrealBuildTool;

namespace UnrealBuildTool.Rules
{
    public class MainModule : ModuleRules {
        public MainModule( ReadOnlyTargetRules Target ) : base( Target )
        {
            PrivateDependencyModuleNames.AddRange( new string[] {
                    "GameModule",
                });
        }
    }
}

このとき GameModule の Core は PublicDependency なので、MainModule の include path に Core が含まれます。もし GameModule の Core が Private なら MainModule の include path に Core は含まれません。

つまり、他の Module に公開したいヘッダファイルがある場合、ヘッダ側で include している Module は Public にしておく必要があります。他の Module から参照されることがない GameProject のような Module (PRIMARY_GAME_MODULE) では、すべて Private 宣言にして構いません。


●外部ライブラリを参照する場合

UnrealBuildTool は "ThirdParty" というフォルダを特別扱いします。このフォルダは検索対象から外れており、ソースコードがあっても勝手にビルドを行いません。外部ライブラリは一般的に ThirdParty フォルダに入れておきます。Build.cs では下記のように相対的に ThirdParty のパスを求めます。

using  UnrealBuildTool;

namespace UnrealBuildTool.Rules
{
    public class GamePlugin : ModuleRules {
        private string ThirdPartyPath
        {
            get { return Path.GetFullPath( Path.Combine( ModuleDirectory, "../../../ThirdParty/" ) ); }
        }

Include path, Lib path, Lib file 等は個別に指定が必要で、さらに Platform も複数あるので外部ライブラリの参照は複雑になりがちです。

using  UnrealBuildTool;
using  System.IO;
using  System.Collections.Generic;

namespace UnrealBuildTool.Rules
{
    public class GamePlugin : ModuleRules {
        private string ThirdPartyPath
        {
            get { return Path.GetFullPath( Path.Combine( ModuleDirectory, "../../../ThirdParty/" ) ); }
        }
        private Dictionary<UnrealTargetPlatform,string> PlatformTable= new Dictionary<UnrealTargetPlatform,string>(){
            {   UnrealTargetPlatform.Win64,     "Windows/x64",  },
            {   UnrealTargetPlatform.Win32,     "Windows/x86",  },
            {   UnrealTargetPlatform.Linux,     "Linux/x64",    },
            {   UnrealTargetPlatform.Android,   "Android28",    },
            {   UnrealTargetPlatform.Mac,       "macOS/x64",    },
            {   UnrealTargetPlatform.IOS,       "iOS/arm64",    },
        };
        public GamePlugin( ReadOnlyTargetRules Target ) : base( Target )
        {
            PublicDependencyModuleNames.AddRange( new string[] {
                    "Core",
                    "CoreUObject",
                    "Engine",
                    "Projects",
            }
            if( !PlatformTable.ContainsKey( Target.Platform ) ){
                return;
            }
            bool debug= Target.Configuration == UnrealTargetConfiguration.Debug && Target.bDebugBuildsActuallyUseDebugCRT;
            string  config= debug ? "Debug" : "Release";
            string  PlatformName= PlatformTable[ Target.Platform ];

            PublicIncludePaths.AddRange( new string[] {
                    Path.Combine( ThirdPartyPath, "flatlib" ),
                });
            if( Target.Platform == UnrealTargetConfiguration.Android ){
                PublicLibraryPaths.AddRange( new string[] {
                        Path.Combine( ThirdPartyPath, "flatlib/lib", PlatformName, "arm7", config ),
                        Path.Combine( ThirdPartyPath, "flatlib/lib", PlatformName, "arm64", config ),
                        Path.Combine( ThirdPartyPath, "flatlib/lib", PlatformName, "x86", config ),
                        Path.Combine( ThirdPartyPath, "flatlib/lib", PlatformName, "x64", config ),
                    });
            }else{
                PublicLibraryPaths.AddRange( new string[] {
                        Path.Combine( ThirdPartyPath, "flatlib/lib", PlatformName, config ),
                    });
            }
            PublicAdditionalLibraries.Add( "flatCore" );
        }
    }
}

外部ライブラリを必要としている Module や Plugin があれば、それぞれの Build.cs に記述しておく必要があります。Makefile の include のように共通の設定を動的に読み込む仕組みがあれば良いのですが、特に用意されていないようです。


●UnrealBuildTool による Build.cs の読み込み方

*.Build.cs は UnrealBuildTool によって dll に変換されます。


 (1) Intermediate/Build/BuildRules/~.dll を読み込む

 (2) もし *.Build.cs が更新されている場合は動的にコンパイルを行い dll を Reload する


この dll の生成は Project 単位で行います。例えば GameProject の場合、下記のファイルをまとめてコンパイルし単一の GameProjectModuleRules.dll が作られます。

GameProjectEditor.Target.cs
GameProject.Build.cs
GameModule.Build.cs
MainModule.Build.cs

  → GameProject/Intermediate/Build/BuildRules/GameProjectModuleRules.dll

Engine も同様で、下記の cs ファイルから単一の dll にコンパイルします。

Engine/Source/UE4Editor.Target.cs
Engine/Plugins/~/*.Build.cs
Engine/Source/~/*.Build.cs

  → Engine/Intermediate/Build/BuildRules/UE4Rules.dll

よって動的な include はできないものの、他の Build.cs や Target.cs で宣言したコードを呼び出すことが可能です。例えば代表 Module を 1つ決めて、Build.cs に共通で使いたいコードを書いておきます。 

// GameProject.Build.cs
using  UnrealBuildTool;
using  System.IO;
using  System.Collections.Generic;

namespace UnrealBuildTool.Rules
{
    public class ThirdPartyCommonLibrary {

        ~

        public static ThirdPartyCommonLibrary Create( ModuleRules rules, ReadOnlyTargetRules target, string path= null )
        {
            ~
        }
        public void SetupFlatlib()
        {
            ~
        }
    }

    public class GameProject : ModuleRules {
        public GameProject( ReadOnlyTargetRules Target ) : base( Target )
        {
            PublicDependencyModuleNames.AddRange( new string[] {
                    "Core",
                    "CoreUObject",
                    "Engine",
            }
            var lib= ThirdPartyCommonLibrary.Create( this, Target );
            lib.SetupFlatlib();
        }
    }
}

他の Module の *.Build.cs からも参照できます。これでメンテしやすくなりすっきりしました。

// GameModule.Build.cs
using  UnrealBuildTool;

namespace UnrealBuildTool.Rules
{
    public class GameModule : ModuleRules {
        public GameModule( ReadOnlyTargetRules Target ) : base( Target )
        {
            PublicDependencyModuleNames.AddRange( new string[] {
                    "Core",
                    "CoreUObject",
                    "Engine",
            }
            var lib= ThirdPartyCommonLibrary.Create( this, Target );
            lib.SetupFlatlib();
        }
    }
}



|