検証環境:UE4.18.0
Tl;Dr
- [PluginName].Build.csに読み込みたいThirdPartyライブラリの名前を指定する
- Engine側のSource/ThirdPartyに入っているものはBuild.csとtpsがあるので名前だけでOK
- ヘッダファイル側ならPublicDependencyModuleNames、ソース側ならPrivateDependencyModuleNamesへ
- (使い分けはこれで合ってるはず)
導入例
今回は例としてopenssl/hmac.hを使いたい場合について説明する
[PluginName].Build.csにライブラリ名を追加する
今回はcpp側でIncludeする予定なので、PrivateDependencyModuleNames
にOpenSSL
を追加する
- OpenSSLはEngine側の
Source/ThirdParty
にBuild.csとtpsがあるので、ライブラリ名だけの指定でOK- Source/ThirdPartyの中にあるフォルダ名=ライブラリ名
- Plugin内にThirdPartyライブラリを自前で持つ場合は、Build.csとtpsを別途作成し、ライブラリフォルダ(Build.csのある場所)への相対パスを指定する必要がある?(未検証)
[PluginName].Build.cs
// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
public class [PluginName] : ModuleRules
{
public [PluginName](ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
// プラグイン本体のヘッダのパス
PublicIncludePaths.AddRange(
new string[] {
"[PluginName]/Public"
// ... add public include paths required here ...
}
);
// プラグイン本体のソース(.cpp)のパス
PrivateIncludePaths.AddRange(
new string[] {
"[PluginName]/Private",
// ... add other private include paths required here ...
}
);
// プラグインのヘッダ内でincludeするやつのパス
PublicDependencyModuleNames.AddRange(
new string[]
{
"Core",
// ... add other public dependencies that you statically link with here ...
}
);
// プラグインのソース内でIncludeするやつのパス
PrivateDependencyModuleNames.AddRange(
new string[]
{
"Projects",
"InputCore",
"UnrealEd",
"LevelEditor",
"CoreUObject",
"Engine",
"Slate",
"SlateCore",
// ... add private dependencies that you statically link with here ...
"OpenSSL", // <= 今回はこれを追加。cpp側でincludeする
}
);
DynamicallyLoadedModuleNames.AddRange(
new string[]
{
// ... add any modules that your module loads dynamically here ...
}
);
}
}
ソース側でIncludeする
VisualStudioなどのIDEを使用している場合、書き方によっては未定義エラーが起きるが、呼び出し方があっていればビルドは通る
(型違いなどのエラーがあればビルドは通りません)
Private/[PluginName].cpp
// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
#include "SHATool.h"
#include "SHAToolStyle.h"
#include "SHAToolCommands.h"
#include "LevelEditor.h"
#include "Widgets/Docking/SDockTab.h"
#include "Widgets/Layout/SBox.h"
#include "Widgets/Text/STextBlock.h"
#include "Widgets/Input/SButton.h"
#include "Framework/MultiBox/MultiBoxBuilder.h"
#include "Base64.h"
#include "string"
// 読み込みたいヘッダファイルを追加
//vvvvvvvvvvvvvvvvvv
#define UI UI_ST
THIRD_PARTY_INCLUDES_START
#include "openssl/hmac.h"
THIRD_PARTY_INCLUDES_END
#undef UI
// ^^^^^^^^^^^^^^^^^^^^^
// ※諸事情によりdefineで囲っている(エラーが出ないやつなら不要)
static const FName [PluginName]TabName("[PluginName]");
#define LOCTEXT_NAMESPACE "F[PluginName]Module"
// ======================== 省略 ========================
FReply F[PluginName]Module::OnClickButton() {
char data[] = "xxxx-xxxx-xxxx-xxxx-xxxx";
char key[] = "xxxx-xxxx-xxxx-xxxx-xxxx";
UE_LOG(LogTemp, Log, TEXT("Clicked"));
unsigned char* result;
unsigned int len = 32;
result = (unsigned char*)malloc(sizeof(char) * len);
// メソッド内で使う
// VisualStudioなどのIDEを使用していると未定義扱いのマークが付く(赤下線)が
// ビルドは通るのでOK
// ※静的解析で型エラーとか起こしてる場合はビルドは通りません
HMAC_CTX ctx;
HMAC_CTX_init(&ctx);
HMAC_Init_ex(&ctx, key, strlen(key), EVP_sha256(), NULL);
HMAC_Update(&ctx, (unsigned char*)&data, strlen(data));
HMAC_Final(&ctx, result, &len);
TArray<uint8> resultArr;
resultArr.Append(result, len);
FString output = FBase64::Encode(resultArr);
free(result);
return FReply::Handled();
}
#undef LOCTEXT_NAMESPACE
IMPLEMENT_MODULE(F[PluginName]Module, [PluginName])
参考文献
- Plug-ins & Third-Party SDKs in UE4
https://www.slideshare.net/GerkeMaxPreussner/plugins-thirdparty-sdks-in-ue4
(だいたいのことは書いてあるはず・・・たぶん)