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?