見出し画像

UE5 EA Visual Studio 2019 ~静的ライブラリ(.lib)を作成してUEで使用する~

Visual Studio 2019から「プリコンパイル済みヘッダーの構成」に変更がありました。
UE5 EAでも問題なく静的ライブラリの関数を呼び出すことが出来たので手順をまとめました。次は動的ライブラリ(.dll)の方も確認します。

Visual Studio 2019で静的ライブラリ(.lib)を作成する

Visual Studio 2019でプロジェクトを作成する

Visual Studio 2019で静的ライブラリ(.lib)を作成するプロジェクトを作成していきます。

Visual Studio 2019 > Create a new project

静的ライブラリ(Static Library)を作成するテンプレートを選択します。

Static Library > Next

Project NameとLocationを設定します。
今回はProject Nameを[StaticLibTest]に設定します。

Project NameとLocationを設定 > Create

ヘッダーファイルとC++ファイルを追加します。

ヘッダー[LibTest.cpp]とC++ファイル[LibTest.cpp]を追加する

LibTest.h

#pragma once

#ifdef __cplusplus
extern "C"
#endif
int TestAdd(int A, int B);

LibTest.cpp

#include "LibTest.h"

int TestAdd(int A, int B)
{
	return A + B;
}

この状態で一度Buildを行います。

プロジェクトファイル右クリック > Build

プリコンパイル済みヘッダーのエラーを修正する

「#include "pch.h"を追加しますか?」という内容のエラーが表示されます。

プリコンパイル済みヘッダーを使用しないようにして直す設定もあります。
LibTest.cppに#include "pch.h"を追加して再ビルドするとエラーが無くなります。

大規模なプログラムを作ることになってくると、当然インクルードするヘッダファイルが増えてきますよね?
実はただinclude文でヘッダファイルを取り込んでいると、
毎回そのヘッダファイルを解析してから読み込むという動作を
繰り返して行っているのでコンパイルに多少時間がかかってます。
ファイルが増えてくると当然比例してコンパイル時間がどんどん長くなっていきます。
プリコンパイル済みヘッダとはコンパイルの最初にインクルードするヘッダを全て解析したヘッダファイルのことで、
それを取り込むファイルは既にその解析済みのヘッダを読むことになります。
よって、コンパイル時間が劇的に早くなります。

プリコンパイル済みヘッダ
#include "pch.h"
#include "LibTest.h"

int TestAdd(int A, int B)
{
	return A + B;
}

2017と2019でプリコンパイル済みヘッダーの構成が変更になったそうです。

【VS 6.0~VS 2017】
stadafx.cpp
  |
  + stdafx.h

【VS 2019】
pch.cpp
  |
  + pch.h
  |    |
  |    + framework.h

【参考URL:プリコンパイル済みのヘッダーファイルについて】

Buildの構成をRelease(x64)に変更してビルドする

構成をRelease(x64)に変更します。
Configuration Managerを開きます。

Configuration Maganerを開く

Active solution configuration:Release
Active solution platform:x64

Release(x64)でBuildする設定

再びBuildを行います。

再びBuildを行う

ビルドすることが出来ました。

ビルド成功

「(プロジェクトフォルダ)/x64/StaticLibTest.lib」が作成されます。

静的ライブラリ(.lib)が作成される

UE5 EAで静的ライブラリを使用する

テスト用のC++プロジェクトを作成する

UE5 EAで静的ライブラリを使用する準備をします。
BlankのC++プロジェクトを作成します。

BlankのC++プロジェクトを作成

静的ライブラリとヘッダーファイルをプロジェクトに追加する

「StaticLibTest.lib」とヘッダーファイル「LibTest.h」を以下の構成になるように配置します。(足りないフォルダは作成してください。)

(Projectフォルダ)
  └ Source/
    └ (Project名)/
      ├ Library/
      | ├ header/
      |  |  └ LibTest.h
      |  └ lib/
      |   └ StaticLibTest.lib
      ├ Private 
      | 

「(UE5 EAプロジェクト名).Build.cs」を開きます。

「(UE5 EAプロジェクト名).Build.cs」を開く

Build.csファイルに以下の修正を行います。
・ヘッダーファイルのIncludePathを追加
・静的ライブラリを追加する(プラットフォームがWin64)

// Copyright Epic Games, Inc. All Rights Reserved.

using UnrealBuildTool;

public class CPP_LibraryTest : ModuleRules
{
	public CPP_LibraryTest(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
	
		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });

		PrivateDependencyModuleNames.AddRange(new string[] {  });

		PublicIncludePaths.Add(ModuleDirectory + "/library/header");

		if(Target.Platform == UnrealTargetPlatform.Win64)
               {
			PublicAdditionalLibraries.Add(ModuleDirectory + "/library/lib/StaticLibTest.lib");
               }
	}
}

IncludePathを追加して、LibTest.hを参照できるようにしています。

PublicIncludePaths.Add(ModuleDirectory + "/library/header");

プラットフォームがWin64の時に「StaticLibTest.lib」をライブラリとして追加します。

		if(Target.Platform == UnrealTargetPlatform.Win64)
               {
			PublicAdditionalLibraries.Add(ModuleDirectory + "/library/lib/StaticLibTest.lib");
               }

Build.csに関する公式ドキュメントはコチラになります。

静的ライブラリ(.lib)とヘッダーファイルの配置、Build.csの修正が出来たら、Visual Studio projectを更新します。

.uprojectを右クリック > Generate Visual Studio project files

静的ライブラリ(.lib)とヘッダーファイルがプロジェクトに追加されました。

静的ライブラリ(.lib)とヘッダーファイルがプロジェクトに追加される

静的ライブラリの関数「TestAdd」を呼び出すActorクラスを作成する

静的ライブラリを呼び出すテストを行うためのActorクラスを追加します。

C++Classes配下のフォルダを右クリック > New C++ Class…

親クラスにActorを選択します。

ACTOR > NEXT >

名前をCallLibFuncActor(Private)に設定します。

Private > Name:CallLibFuncActor > CREATE CLASS

追加したソースコードを修正します。

CallLibFuncActor.h

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "CallLibFuncActor.generated.h"

UCLASS()
class ACallLibFuncActor : public AActor
{
	GENERATED_BODY()

public:
	UFUNCTION(BlueprintCallable, Category="Call Lib Test")
	int CallTestAdd(const int A, const int B);

};

CallLibFuncActor.cpp

#include "CallLibFuncActor.h"
#include "LibTest.h"

int ACallLibFuncActor::CallTestAdd(const int A, const int B)
{
        // 静的ライブラリ(StaticLibTest.lib)から関数[TestAdd]を呼び出す
	return TestAdd(A, B);
}

ブループリントでCallTestAddを呼び出すことで、静的ライブラリ(StaticLibTest.lib)から関数[TestAdd]を呼び出すことが出来る準備が整いました。
AとBの足し算の結果が返ってきたら無事呼び出せたことが確認できます。

int TestAdd(int A, int B)
{
	return A + B;
}

ビューポートにActorを追加して静的ライブラリの関数を呼び出す

CallTestAddを呼び出して、結果をPrintStringで出力する処理を書いていきます。ビューポートに「CallLibFuncActor」を追加します。

ビューポートに「CallLibFuncActor」を追加

レベルブループリントを開きます。

Blueprints > Open Level Blueprint

BeginPlay時に関数「CallTestAdd」を呼び出して、PrintStringで出力する処理を実装します。

BeginPlay時に関数「CallTestAdd」を呼び出して、PrintStringで出力する処理を実装

プレイした時に[11](5+6)の結果が出力されているので、静的ライブラリの関数を呼び出すことが出来ました。

静的ライブラリの関数を呼び出すことが出来た

まとめ

UE5になることでC++が劇的に変わるということは今のところないです。
UE5に関連する開発ツール(Visual Studio)の方が変わっていることの方が躓くポイントになっています。特に導入部分のエラーがなんで起きてしまうのか調べるところに時間がかかります。
少しずつですが、躓くポイントの解決しながら進めることでC++を書くことに集中できるようになってきました。
作業をするソフトの更新は追っていけるような工夫をした方がよさそうですね。

この記事が気に入ったらサポートをしてみませんか?