Generally, anything you want to add to the Engine needs to become a “module”.
Take a look in the Engine/Source/ThirdParty folder - any one of those is an external library, either dynamically or statically linked.
For example, SDL2 is a full featured framework and if you look at its SDL2.Build.cs you can see how it is setup to find and connect to include and lib folders for each supported platform:
public class SDL2 : ModuleRules
public SDL2(TargetInfo Target)
Type = ModuleType.External;
string SDL2Path = UEBuildConfiguration.UEThirdPartySourceDirectory + "SDL2/SDL-gui-backend/";
string SDL2LibPath = SDL2Path + "lib/";
PublicIncludePaths.Add(SDL2Path + "include");
PublicAdditionalLibraries.Add(SDL2LibPath + "Linux/" + Target.Architecture + "/libSDL2_fPIC.a");
Then somewhere in the Engine code, where you need this library (now a module), you would include a reference to it as a module name (in this case SDL2) in the Build.cs file.
For example, from Engine/Source/Runtime/Core/Core.Build.cs:
else if ((Target.Platform == UnrealTargetPlatform.Linux))
And then in your code you would add your includes and call the library functions:
// load splash .bmp image
GSplashScreenImage = SDL_LoadBMP(TCHAR_TO_UTF8(*GSplashPath));
Does that make sense?