error: inline function 'Class::Method' is not defined [-Werror,-Wundefined-inline]

We have a fairly large codebase and have integrated a few libraries and plugins such as UFSM, FMODStudio, libb64, Boost, cereal, CppDB, Crypto++, libfmt, lmdb, lmdbxx and SQLite3.

Up to yesterday, everything was working fine on 4.18. We did add a few new classes some hundred lines of code. Ususally I develop on Linux and later fix possible build errors on Windows.

We hit a bug with took us a few hours to realize what happend. On my linux machine with Clang 4, I’ll get the following:



Performing 4 actions (8 in parallel)

[1/4] Compile Module.Reminiscence.2_of_2.cpp

[2/4] Compile Module.Reminiscence.1_of_2.cpp

In file included from /mnt/dev/Reminiscence/Intermediate/Build/Linux/B4D820EA/UE4Editor/DebugGame/Reminiscence/Module.Reminiscence.2_of_2.cpp:2:

In file included from /mnt/dev/Reminiscence/Source/Reminiscence/Private/Player/RPlayerCharacterMovementComponent.cpp:16:

../../../../mnt/dev/Reminiscence/Source/Reminiscence/Public/Player/RPlayerCharacter.h:719:40: error: inline function 'ARPlayerCharacter::GetCurrentMovementState' is not defined -Werror,-Wundefined-inline]

FORCEINLINE const MovementStatePtr GetCurrentMovementState() const;

^

/mnt/dev/Reminiscence/Source/Reminiscence/Private/Player/RPlayerCharacterMovementComponent.cpp:411:24: note: used here

owner->GetCurrentMovementState();

^

In file included from /mnt/dev/Reminiscence/Intermediate/Build/Linux/B4D820EA/UE4Editor/DebugGame/Reminiscence/Module.Reminiscence.2_of_2.cpp:3:

In file included from /mnt/dev/Reminiscence/Source/Reminiscence/Private/Player/RPlayerController.cpp:23:

../../../../mnt/dev/Reminiscence/Source/Reminiscence/Public/Editor/PlatformTools/RPlatform.h:47:34: error: inline function 'ARPlatform::GetType' is not defined -Werror,-Wundefined-inline]

FORCEINLINE const EPlatform& GetType() const;

^

/mnt/dev/Reminiscence/Source/Reminiscence/Private/Player/RPlayerController.cpp:1202:46: note: used here

&& platform && platform->GetType() != EPlatform::None) {

^

In file included from /mnt/dev/Reminiscence/Intermediate/Build/Linux/B4D820EA/UE4Editor/DebugGame/Reminiscence/Module.Reminiscence.2_of_2.cpp:2:

In file included from /mnt/dev/Reminiscence/Source/Reminiscence/Private/Player/RPlayerCharacterMovementComponent.cpp:16:

../../../../mnt/dev/Reminiscence/Source/Reminiscence/Public/Player/RPlayerCharacter.h:717:40: error: inline function 'ARPlayerCharacter::GetMovementStateObject' is not defined -Werror,-Wundefined-inline]

FORCEINLINE const MovementStatePtr GetMovementStateObject(

^

/mnt/dev/Reminiscence/Source/Reminiscence/Private/Player/RPlayerController.cpp:1252:37: note: used here

targetState = this->Puppet->GetMovementStateObject(

^

In file included from /mnt/dev/Reminiscence/Intermediate/Build/Linux/B4D820EA/UE4Editor/DebugGame/Reminiscence/Module.Reminiscence.2_of_2.cpp:2:

In file included from /mnt/dev/Reminiscence/Source/Reminiscence/Private/Player/RPlayerCharacterMovementComponent.cpp:16:

../../../../mnt/dev/Reminiscence/Source/Reminiscence/Public/Player/RPlayerCharacter.h:637:22: error: inline function 'ARPlayerCharacter::CheckMovementTransition' is not defined -Werror,-Wundefined-inline]

bool FORCEINLINE CheckMovementTransition(

^

/mnt/dev/Reminiscence/Source/Reminiscence/Private/Player/RPlayerController.cpp:1271:23: note: used here

if (this->Puppet->CheckMovementTransition(

^

In file included from /mnt/dev/Reminiscence/Intermediate/Build/Linux/B4D820EA/UE4Editor/DebugGame/Reminiscence/Module.Reminiscence.2_of_2.cpp:2:

In file included from /mnt/dev/Reminiscence/Source/Reminiscence/Private/Player/RPlayerCharacterMovementComponent.cpp:16:

../../../../mnt/dev/Reminiscence/Source/Reminiscence/Public/Player/RPlayerCharacter.h:690:23: error: inline function 'ARPlayerCharacter::GetCameraPitch' is not defined -Werror,-Wundefined-inline]

FORCEINLINE float GetCameraPitch();

^

/mnt/dev/Reminiscence/Source/Reminiscence/Private/Weapon/RWeapon.cpp:314:55: note: used here

m_pimpl->RecoilStartPitch = pawn->GetCameraPitch();

^

5 errors generated.

In file included from /mnt/dev/Reminiscence/Intermediate/Build/Linux/B4D820EA/UE4Editor/DebugGame/Reminiscence/Module.Reminiscence.1_of_2.cpp:51:

In file included from /mnt/dev/Reminiscence/Source/Reminiscence/Private/Generic/RCharacter.cpp:38:

../../../../mnt/dev/Reminiscence/Source/Reminiscence/Public/Weapon/RWeapon.h:432:32: error: inline function 'ARWeapon::GetStorageSlot' is not defined -Werror,-Wundefined-inline]

FORCEINLINE EInventorySlot GetStorageSlot() const;

^

/mnt/dev/Reminiscence/Source/Reminiscence/Private/Generic/RCharacter.cpp:382:25: note: used here

if (weapon->GetStorageSlot() == checkSlot) {

^

In file included from /mnt/dev/Reminiscence/Intermediate/Build/Linux/B4D820EA/UE4Editor/DebugGame/Reminiscence/Module.Reminiscence.1_of_2.cpp:51:

In file included from /mnt/dev/Reminiscence/Source/Reminiscence/Private/Generic/RCharacter.cpp:38:

../../../../mnt/dev/Reminiscence/Source/Reminiscence/Public/Weapon/RWeapon.h:434:22: error: inline function 'ARWeapon::IsAttachedToPawn' is not defined -Werror,-Wundefined-inline]

FORCEINLINE bool IsAttachedToPawn() const;

^

/mnt/dev/Reminiscence/Source/Reminiscence/Private/Generic/RCharacter.cpp:438:38: note: used here

if (m_pimpl->PreviousWeapon->IsAttachedToPawn()) {

^

In file included from /mnt/dev/Reminiscence/Intermediate/Build/Linux/B4D820EA/UE4Editor/DebugGame/Reminiscence/Module.Reminiscence.1_of_2.cpp:51:

In file included from /mnt/dev/Reminiscence/Source/Reminiscence/Private/Generic/RCharacter.cpp:38:

../../../../mnt/dev/Reminiscence/Source/Reminiscence/Public/Weapon/RWeapon.h:419:39: error: inline function 'ARWeapon::GetEmptyMagazineMesh' is not defined -Werror,-Wundefined-inline]

FORCEINLINE UStaticMeshComponent* GetEmptyMagazineMesh();

^

/mnt/dev/Reminiscence/Source/Reminiscence/Private/Generic/RCharacter.cpp:452:72: note: used here

UStaticMeshComponent* emptyMagazineMesh = this->CurrentWeapon->GetEmptyMagazineMesh();

^

In file included from /mnt/dev/Reminiscence/Intermediate/Build/Linux/B4D820EA/UE4Editor/DebugGame/Reminiscence/Module.Reminiscence.1_of_2.cpp:51:

In file included from /mnt/dev/Reminiscence/Source/Reminiscence/Private/Generic/RCharacter.cpp:38:

../../../../mnt/dev/Reminiscence/Source/Reminiscence/Public/Weapon/RWeapon.h:420:39: error: inline function 'ARWeapon::GetFullMagazineMesh' is not defined -Werror,-Wundefined-inline]

FORCEINLINE UStaticMeshComponent* GetFullMagazineMesh();

^

/mnt/dev/Reminiscence/Source/Reminiscence/Private/Generic/RCharacter.cpp:453:71: note: used here

UStaticMeshComponent* fullMagazineMesh = this->CurrentWeapon->GetFullMagazineMesh();

^

In file included from /mnt/dev/Reminiscence/Intermediate/Build/Linux/B4D820EA/UE4Editor/DebugGame/Reminiscence/Module.Reminiscence.1_of_2.cpp:51:

In file included from /mnt/dev/Reminiscence/Source/Reminiscence/Private/Generic/RCharacter.cpp:38:

../../../../mnt/dev/Reminiscence/Source/Reminiscence/Public/Weapon/RWeapon.h:406:32: error: inline function 'ARWeapon::GetCurrentState' is not defined -Werror,-Wundefined-inline]

FORCEINLINE const StatePtr GetCurrentState() const;

^

/mnt/dev/Reminiscence/Source/Reminiscence/Private/Generic/RCharacter.cpp:723:63: note: used here

ARWeapon::StatePtr weaponState = this->CurrentWeapon->GetCurrentState();

^

In file included from /mnt/dev/Reminiscence/Intermediate/Build/Linux/B4D820EA/UE4Editor/DebugGame/Reminiscence/Module.Reminiscence.1_of_2.cpp:51:

In file included from /mnt/dev/Reminiscence/Source/Reminiscence/Private/Generic/RCharacter.cpp:31:

../../../../mnt/dev/Reminiscence/Source/Reminiscence/Public/Weapon/RKnife.h:72:32: error: inline function 'ARKnife::GetCollision' is not defined -Werror,-Wundefined-inline]

FORCEINLINE UBoxComponent* GetCollision() const;

^

/mnt/dev/Reminiscence/Source/Reminiscence/Private/Grenade/RGrenade.cpp:224:30: note: used here

inventory.Knife->GetCollision()->MoveIgnoreActors.AddUnique(this);

^

In file included from /mnt/dev/Reminiscence/Intermediate/Build/Linux/B4D820EA/UE4Editor/DebugGame/Reminiscence/Module.Reminiscence.1_of_2.cpp:51:

In file included from /mnt/dev/Reminiscence/Source/Reminiscence/Private/Generic/RCharacter.cpp:38:

../../../../mnt/dev/Reminiscence/Source/Reminiscence/Public/Weapon/RWeapon.h:411:32: error: inline function 'ARWeapon::GetMeleeCollision' is not defined -Werror,-Wundefined-inline]

FORCEINLINE UBoxComponent* GetMeleeCollision() const;

^

/mnt/dev/Reminiscence/Source/Reminiscence/Private/Grenade/RGrenade.cpp:251:25: note: used here

weapon->GetMeleeCollision()->MoveIgnoreActors.AddUnique(this);

^

In file included from /mnt/dev/Reminiscence/Intermediate/Build/Linux/B4D820EA/UE4Editor/DebugGame/Reminiscence/Module.Reminiscence.1_of_2.cpp:51:

In file included from /mnt/dev/Reminiscence/Source/Reminiscence/Private/Generic/RCharacter.cpp:38:

../../../../mnt/dev/Reminiscence/Source/Reminiscence/Public/Weapon/RWeapon.h:484:31: error: inline function 'ARWeapon::GetBlockedAnimation' is not defined -Werror,-Wundefined-inline]

FORCEINLINE UAnimMontage* GetBlockedAnimation() const;

^

/mnt/dev/Reminiscence/Source/Reminiscence/Private/Player/RPlayerCharacter.cpp:665:58: note: used here

UAnimMontage* animMontage = this->CurrentWeapon->GetBlockedAnimation();

^

In file included from /mnt/dev/Reminiscence/Intermediate/Build/Linux/B4D820EA/UE4Editor/DebugGame/Reminiscence/Module.Reminiscence.1_of_2.cpp:51:

In file included from /mnt/dev/Reminiscence/Source/Reminiscence/Private/Generic/RCharacter.cpp:38:

../../../../mnt/dev/Reminiscence/Source/Reminiscence/Public/Weapon/RWeapon.h:485:23: error: inline function 'ARWeapon::GetBlockedAnimationEnteringSectionName' is not defined -Werror,-Wundefined-inline]

FORCEINLINE FName GetBlockedAnimationEnteringSectionName() const;

^

/mnt/dev/Reminiscence/Source/Reminiscence/Private/Player/RPlayerCharacter.cpp:669:46: note: used here

this->CurrentWeapon->GetBlockedAnimationEnteringSectionName());

^

In file included from /mnt/dev/Reminiscence/Intermediate/Build/Linux/B4D820EA/UE4Editor/DebugGame/Reminiscence/Module.Reminiscence.1_of_2.cpp:51:

In file included from /mnt/dev/Reminiscence/Source/Reminiscence/Private/Generic/RCharacter.cpp:38:

../../../../mnt/dev/Reminiscence/Source/Reminiscence/Public/Weapon/RWeapon.h:487:23: error: inline function 'ARWeapon::GetBlockedAnimationExitingSectionName' is not defined -Werror,-Wundefined-inline]

FORCEINLINE FName GetBlockedAnimationExitingSectionName() const;

^

/mnt/dev/Reminiscence/Source/Reminiscence/Private/Player/RPlayerCharacter.cpp:688:46: note: used here

this->CurrentWeapon->GetBlockedAnimationExitingSectionName());

^

In file included from /mnt/dev/Reminiscence/Intermediate/Build/Linux/B4D820EA/UE4Editor/DebugGame/Reminiscence/Module.Reminiscence.1_of_2.cpp:51:

In file included from /mnt/dev/Reminiscence/Source/Reminiscence/Private/Generic/RCharacter.cpp:38:

../../../../mnt/dev/Reminiscence/Source/Reminiscence/Public/Weapon/RWeapon.h:489:31: error: inline function 'ARWeapon::GetFiringAnimation' is not defined -Werror,-Wundefined-inline]

FORCEINLINE UAnimMontage* GetFiringAnimation() const;

^

/mnt/dev/Reminiscence/Source/Reminiscence/Private/Player/RPlayerCharacter.cpp:702:58: note: used here

UAnimMontage* animMontage = this->CurrentWeapon->GetFiringAnimation();

^

In file included from /mnt/dev/Reminiscence/Intermediate/Build/Linux/B4D820EA/UE4Editor/DebugGame/Reminiscence/Module.Reminiscence.1_of_2.cpp:51:

In file included from /mnt/dev/Reminiscence/Source/Reminiscence/Private/Generic/RCharacter.cpp:38:

../../../../mnt/dev/Reminiscence/Source/Reminiscence/Public/Weapon/RWeapon.h:492:23: error: inline function 'ARWeapon::GetIronSightCameraZoomInTransitionDelay' is not defined -Werror,-Wundefined-inline]

FORCEINLINE float GetIronSightCameraZoomInTransitionDelay() const;

^

/mnt/dev/Reminiscence/Source/Reminiscence/Private/Player/RPlayerCharacter.cpp:750:42: note: used here

this->CurrentWeapon->GetIronSightCameraZoomInTransitionDelay(),

^

In file included from /mnt/dev/Reminiscence/Intermediate/Build/Linux/B4D820EA/UE4Editor/DebugGame/Reminiscence/Module.Reminiscence.1_of_2.cpp:51:

In file included from /mnt/dev/Reminiscence/Source/Reminiscence/Private/Generic/RCharacter.cpp:38:

../../../../mnt/dev/Reminiscence/Source/Reminiscence/Public/Weapon/RWeapon.h:495:31: error: inline function 'ARWeapon::GetIronSightAnimation' is not defined -Werror,-Wundefined-inline]

FORCEINLINE UAnimMontage* GetIronSightAnimation() const;

^

/mnt/dev/Reminiscence/Source/Reminiscence/Private/Player/RPlayerCharacter.cpp:753:58: note: used here

UAnimMontage* animMontage = this->CurrentWeapon->GetIronSightAnimation();

^

In file included from /mnt/dev/Reminiscence/Intermediate/Build/Linux/B4D820EA/UE4Editor/DebugGame/Reminiscence/Module.Reminiscence.1_of_2.cpp:51:

In file included from /mnt/dev/Reminiscence/Source/Reminiscence/Private/Generic/RCharacter.cpp:38:

../../../../mnt/dev/Reminiscence/Source/Reminiscence/Public/Weapon/RWeapon.h:496:23: error: inline function 'ARWeapon::GetIronSightAnimationZoomingInSectionName' is not defined -Werror,-Wundefined-inline]

FORCEINLINE FName GetIronSightAnimationZoomingInSectionName() const;

^

/mnt/dev/Reminiscence/Source/Reminiscence/Private/Player/RPlayerCharacter.cpp:757:46: note: used here

this->CurrentWeapon->GetIronSightAnimationZoomingInSectionName());

^

In file included from /mnt/dev/Reminiscence/Intermediate/Build/Linux/B4D820EA/UE4Editor/DebugGame/Reminiscence/Module.Reminiscence.1_of_2.cpp:51:

In file included from /mnt/dev/Reminiscence/Source/Reminiscence/Private/Generic/RCharacter.cpp:38:

../../../../mnt/dev/Reminiscence/Source/Reminiscence/Public/Weapon/RWeapon.h:493:23: error: inline function 'ARWeapon::GetIronSightCameraZoomOutTransitionDelay' is not defined -Werror,-Wundefined-inline]

FORCEINLINE float GetIronSightCameraZoomOutTransitionDelay() const;

^

/mnt/dev/Reminiscence/Source/Reminiscence/Private/Player/RPlayerCharacter.cpp:780:42: note: used here

this->CurrentWeapon->GetIronSightCameraZoomOutTransitionDelay(),

^

In file included from /mnt/dev/Reminiscence/Intermediate/Build/Linux/B4D820EA/UE4Editor/DebugGame/Reminiscence/Module.Reminiscence.1_of_2.cpp:51:

In file included from /mnt/dev/Reminiscence/Source/Reminiscence/Private/Generic/RCharacter.cpp:38:

../../../../mnt/dev/Reminiscence/Source/Reminiscence/Public/Weapon/RWeapon.h:499:23: error: inline function 'ARWeapon::GetIronSightAnimationZoomingOutSectionName' is not defined -Werror,-Wundefined-inline]

FORCEINLINE FName GetIronSightAnimationZoomingOutSectionName() const;

^

/mnt/dev/Reminiscence/Source/Reminiscence/Private/Player/RPlayerCharacter.cpp:787:46: note: used here

this->CurrentWeapon->GetIronSightAnimationZoomingOutSectionName());

^

In file included from /mnt/dev/Reminiscence/Intermediate/Build/Linux/B4D820EA/UE4Editor/DebugGame/Reminiscence/Module.Reminiscence.1_of_2.cpp:51:

In file included from /mnt/dev/Reminiscence/Source/Reminiscence/Private/Generic/RCharacter.cpp:38:

../../../../mnt/dev/Reminiscence/Source/Reminiscence/Public/Weapon/RWeapon.h:498:23: error: inline function 'ARWeapon::GetIronSightAnimationFiringSectionName' is not defined -Werror,-Wundefined-inline]

FORCEINLINE FName GetIronSightAnimationFiringSectionName() const;

^

/mnt/dev/Reminiscence/Source/Reminiscence/Private/Player/RPlayerCharacter.cpp:855:48: note: used here

sectionName = this->CurrentWeapon->GetIronSightAnimationFiringSectionName();

^

In file included from /mnt/dev/Reminiscence/Intermediate/Build/Linux/B4D820EA/UE4Editor/DebugGame/Reminiscence/Module.Reminiscence.1_of_2.cpp:51:

In file included from /mnt/dev/Reminiscence/Source/Reminiscence/Private/Generic/RCharacter.cpp:38:

../../../../mnt/dev/Reminiscence/Source/Reminiscence/Public/Weapon/RWeapon.h:497:23: error: inline function 'ARWeapon::GetIronSightAnimationIdleSectionName' is not defined -Werror,-Wundefined-inline]

FORCEINLINE FName GetIronSightAnimationIdleSectionName() const;

^

/mnt/dev/Reminiscence/Source/Reminiscence/Private/Player/RPlayerCharacter.cpp:908:48: note: used here

sectionName = this->CurrentWeapon->GetIronSightAnimationIdleSectionName();

^

In file included from /mnt/dev/Reminiscence/Intermediate/Build/Linux/B4D820EA/UE4Editor/DebugGame/Reminiscence/Module.Reminiscence.1_of_2.cpp:51:

In file included from /mnt/dev/Reminiscence/Source/Reminiscence/Private/Generic/RCharacter.cpp:38:

../../../../mnt/dev/Reminiscence/Source/Reminiscence/Public/Weapon/RWeapon.h:506:31: error: inline function 'ARWeapon::GetMeleeAnimation' is not defined -Werror,-Wundefined-inline]

FORCEINLINE UAnimMontage* GetMeleeAnimation() const;

^

/mnt/dev/Reminiscence/Source/Reminiscence/Private/Player/RPlayerCharacter.cpp:973:48: note: used here

animMontage = this->CurrentWeapon->GetMeleeAnimation();

^

fatal error: too many errors emitted, stopping now -ferror-limit=]

20 errors generated.

ERROR: UBT ERROR: Failed to produce item: /mnt/dev/Reminiscence/Binaries/Linux/libUE4Editor-Reminiscence-Linux-DebugGame.so

Total build time: 22.59 seconds (Local executor: 0.00 seconds)

Makefile:33140: recipe for target 'ReminiscenceEditor-Linux-DebugGame' failed

make: *** [ReminiscenceEditor-Linux-DebugGame] Error 5

12:35:14: The process "/usr/bin/make" exited with code 2.

Error while building/deploying project Reminiscence (kit: UE4)

When executing step "Make"


On Windows, Visual Studio will build fine. But, when we cook on Windows it produces similar errors which actually makes sense. An inline function should exists inside the compilation unit. UE4 build system splits our module into to compilation units which causes the error. If I remove a few lines of code and re-generate project files it uses single cpp file doing a unity build.



Using bundled libc++ standard C++ library.

Using fast way to relink circularly dependent libraries (no FixDeps).

Performing 3 actions (8 in parallel)

[1/3] Compile Module.Reminiscence.cpp

[2/3] Link libUE4Editor-Reminiscence-Linux-DebugGame.so

[3/3] Link libUE4Editor-ReminiscenceEditor-Linux-DebugGame.so

Total build time: 51.27 seconds (Local executor: 33.76 seconds)

14:08:35: The process "/usr/bin/make" exited normally.

14:08:35: Elapsed time: 02:43.


I noticed there is an option for controlling this behavior:



https://docs.unrealengine.com/latest/INT/Programming/UnrealBuildSystem/Configuration/
NumIncludedBytesPerUnityCPP
 	An approximate number of bytes of C++ code to target for inclusion in a single unified C++ file.  

Looking at the source code inside the engine source tree, the default value for that option is 384KB. We increased it to even 100MB but it refuses to work.

Is there any way to overcome this issue?

In addition to the above issue, it seems we cannot disable unity builds either.

I added the following inside our .Target.cs:



        this.bUseUnityBuild = false;
        this.bForceUnityBuild = false;


And even this inside our .Build.cs file:



        this.bFasterWithoutUnity = true;


Without any luck. It still does the unity builds. Unfortunately, at this stage we cannot build our game anymore.

UBT does not split the header file when creating a unity build, so you must have done something wrong like having the definition of an inlined method in the source file.

Well, I managed to build the project despite the fact that NumIncludedBytesPerUnityCPP won’t work. I realized I made a few mistakes which I would like to share in case someone else come across this thread for the same reason.

First, I mistankely set this.bFasterWithoutUnity to false inside my target. It forced UBT to not do unity builds. Changing that to true made it work and do non-unity builds. Still, this.bUseUnityBuild and this.bForceUnityBuild refuse to work.

Then I followed this guide on IWYU builds: IWYU Reference Guide | Unreal Engine Documentation which is a cleaner approach than including Engine.h and helped me find and add the missing headers.

In the next step, I moved all my inline functions from the cpp files to .h files which exposed the inline functions to all other build units (on my single file unity build this was not an issue at all, so I made the mistake of putting my my inline functions inside the cpp file instead of the .h files). It caused me many troubles since I’m using Opaque Pointer design pattern to hide the private implementation in order to speed up build times. Nonetheless after a couple of hours I moved out the required parts from the Opaque Pointers to the header files. And viola everything worked on my Clang/Linux setup. Then I re-enabled the unity builds and despite the fact that UBT split the build units into two files it all worked out.

Unfortunately, I faced other issues on Windows (due to including a few Windows and Boost header files I believe). MSVC started producing errors such as: it cannot find GetObjectW on TScriptInterface objects or DrawTextW inside my HUD class, or _InterlockedIncrement from engine files. Obviously, there was a clash between windows defined macros on UNICODE builds and Unreal Engine method names or my own methods. So, I managed to resolve those by defining a generic header file and include it where it is necessary with the following content:



/// RWindows.h

#pragma once

#if defined ( _WIN32 ) || defined ( _WIN64 )
#include <Shlobj.h>
#include <Windows.h>
#include <Winuser.h>

#undef CopyFile
#undef CreateDirectory
#undef DeleteFile
#undef DrawText
#undef GetObject
#undef InterlockedAdd
#undef InterlockedDecrement
#undef InterlockedExchange
#undef InterlockedIncrement
#undef MoveFile
#undef UpdateResource
#endif  /* defined ( _WIN32 ) || defined ( _WIN64 ) */


So, it’s all fine for now.

Well, if you take a look at the source code, I’m afraid it does:

https://github.com/EpicGames/UnrealEngine/blob/release/Engine/Source/Programs/UnrealBuildTool/System/Unity.cs



// Determine unity file path name
string UnityCPPFileName;
if (AllUnityFiles.Count > 1)
{
    UnityCPPFileName = string.Format("{0}{1}.{2}_of_{3}.cpp", ModulePrefix, BaseName, CurrentUnityFileCount, AllUnityFiles.Count);
}
else
{
    UnityCPPFileName = string.Format("{0}{1}.cpp", ModulePrefix, BaseName);
}
FileReference UnityCPPFilePath = FileReference.Combine(CompileEnvironment.OutputDirectory, UnityCPPFileName);


This is actually what happens if you look at the build log from the first post.