I am trying to link a static third party library to Unreal Engine 4.
I am trying to include a 3rd party library/SDK called libZPlay. I tried following the Linking Static Libraries Using The Build System wiki guide, however, am having problems. I am using UE 4.8.0 and libZPlay is a 32-bit library.
The following is my current build file after following the guide:
using UnrealBuildTool;
using System.IO;
public class Rhythm : ModuleRules{
//for linking 3rd party libraries
private string ModulePath{
get { return Path.GetDirectoryName(RulesCompiler.GetModuleFilename(this.GetType().Name)); }
}
private string ThirdPartyPath{
get { return Path.GetFullPath(Path.Combine(ModulePath, "../../ThirdParty/")); }
}
//normal after this
public Rhythm(TargetInfo Target){
MinFilesUsingPrecompiledHeaderOverride = 1;//faster builds
bFasterWithoutUnity = true;//faster builds
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });
PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });//for UMG
LoadlibZPlay(Target); //load libZPlay library
}
public bool LoadlibZPlay(TargetInfo Target){
bool isLibrarySupported = false;
if ((Target.Platform == UnrealTargetPlatform.Win64) || (Target.Platform == UnrealTargetPlatform.Win32)){
isLibrarySupported = true;
string PlatformString = (Target.Platform == UnrealTargetPlatform.Win64) ? "x64" : "x86"; //prob not needed since only one version of the file
string LibrariesPath = Path.Combine(ThirdPartyPath, "libZPlay", "Libraries");
PublicAdditionalLibraries.Add(Path.Combine(LibrariesPath, "libzplay.lib"));
//PublicAdditionalLibraries.Add(Path.Combine(LibrariesPath, "libzplay_borland.lib"));
PublicAdditionalLibraries.Add(Path.Combine(LibrariesPath, "libzplay.a"));
//PublicAdditionalLibraries.Add(Path.Combine(LibrariesPath, "libzplay.dll"));
PublicDelayLoadDLLs.Add(Path.Combine(LibrariesPath, "libzplay.dll"));
}
if (isLibrarySupported){
//include path
PublicIncludePaths.Add(Path.Combine(ThirdPartyPath, "libZPlay", "Includes"));
}
Definitions.Add(string.Format("WITH_LIBZPLAY_BINDING={0}", isLibrarySupported ? 1 : 0));
return isLibrarySupported;
}
}
I have a ThirdParty folder in the root directory of the project, a libZPlay folder is in there that contains an Includes folder with my header files. Additionally, in the libZPlay folder there is a Libraries folder that contains my libZPlay.dll, libZPlay.lib, and libZPlay.a files. The header file is included in the following fashion: #include "../../ThirdParty/libZPlay/Includes/libzplay.h". The visual studio files were also regenerated after all of this was added.
I try to run a function from said external library called 'CreateZPlay()' as shown below:
void UMusicAnalyzerWidget::initilizeMusicAnalyzer(){
player = libZPlay::CreateZPlay();
filePath = "D:/Christian/Music/Archive/Stick Me In My Heart (Radio Edit).mp3";
}
'player' is a ZPlay pointer created inside the UMusicAnalyzerWidget class, the function pretty much creates and initializes the object. However, when trying to build/compile i get the following errors:
Error 8 error LNK2019: unresolved external symbol __imp_CreateZPlay referenced in function "public: void __cdecl UMusicAnalyzerWidget::execinitilizeMusicAnalyzer(struct FFrame &,void * const)" (?execinitilizeMusicAnalyzer@UMusicAnalyzerWidget@@QEAAXAEAUFFrame@@QEAX@Z) D:\GitHub\Rhythm\Rhythm\Intermediate\ProjectFiles\MusicAnalyzerWidget.cpp.obj Rhythm
Error 9 error LNK1120: 1 unresolved externals D:\GitHub\Rhythm\Rhythm\Binaries\Win64\UE4Editor-Rhythm.dll 1 1 Rhythm
Error 10 error : Failed to produce item: D:\GitHub\Rhythm\Rhythm\Binaries\Win64\UE4Editor-Rhythm.dll D:\GitHub\Rhythm\Rhythm\Intermediate\ProjectFiles\ERROR Rhythm
Error 11 error MSB3075: The command ""D:\Programs\Epic Games\4.8\Engine\Build\BatchFiles\Rebuild.bat" RhythmEditor Win64 Development "D:\GitHub\Rhythm\Rhythm\Rhythm.uproject" -rocket" exited with code 5. Please verify that you have sufficient rights to run this command. C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.MakeFile.Targets 43 5 Rhythm
After a bunch of looking around and stuff, I am stuck and not sure how to proceed. I beleive it might be because this is a 32-bit library (without any 64-bit version) and Unreal Engine 4 compiles at only 64-bit. Any insight would be great!
The link you provided actually confirmed your suspicion that UE4 does not support 32bit libraries:
You will need a 64bit version.