UE 5.6 Android linker error on non-virtual thunk to AController

Packaging my project with 5.6 or trying to run an an emulated android device results in the following errors I have no clue how to fix it. Any ideas?

UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): [14/15] clang++ Chaos2-Android-Shipping-arm64.so
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): ld.lld: error: undefined symbol: non-virtual thunk to AController::GetNavAgentPropertiesRef() const
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): >>> referenced by Module.Chaos2.gen.cpp
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): >>> D:/Users/tmi/Documents/Unreal Projects/Chaos2/Intermediate/Build/Android/a/UnrealGame/Shipping/Chaos2/Module.Chaos2.gen.cpp.o:(vtable for AChaos2PlayerController)
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): >>> did you mean: non-virtual thunk to AController::GetNavAgentPropertiesRef() const
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): >>> defined in: D:/Unreal/Epic Games/UE_5.6/Engine/Intermediate/Build/Android/a/UnrealGame/Shipping/Engine/Module.Engine.41.cpp.o
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): ld.lld: error: undefined symbol: non-virtual thunk to AController::GetNavAgentLocation() const
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): >>> referenced by Module.Chaos2.gen.cpp
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): >>> D:/Users/tmi/Documents/Unreal Projects/Chaos2/Intermediate/Build/Android/a/UnrealGame/Shipping/Chaos2/Module.Chaos2.gen.cpp.o:(vtable for AChaos2PlayerController)
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): >>> did you mean: non-virtual thunk to AController::GetNavAgentLocation() const
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): >>> defined in: D:/Unreal/Epic Games/UE_5.6/Engine/Intermediate/Build/Android/a/UnrealGame/Shipping/Engine/Module.Engine.41.cpp.o
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): ld.lld: error: undefined symbol: non-virtual thunk to AController::GetMoveGoalReachTest(AActor const*, UE::Math::TVector const&, UE::Math::TVector&, float&, float&) const
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): >>> referenced by Module.Chaos2.gen.cpp
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): >>> D:/Users/tmi/Documents/Unreal Projects/Chaos2/Intermediate/Build/Android/a/UnrealGame/Shipping/Chaos2/Module.Chaos2.gen.cpp.o:(vtable for AChaos2PlayerController)
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): ld.lld: error: undefined symbol: non-virtual thunk to AController::ShouldPostponePathUpdates() const
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): >>> referenced by Module.Chaos2.gen.cpp
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): >>> D:/Users/tmi/Documents/Unreal Projects/Chaos2/Intermediate/Build/Android/a/UnrealGame/Shipping/Chaos2/Module.Chaos2.gen.cpp.o:(vtable for AChaos2PlayerController)
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): ld.lld: error: undefined symbol: non-virtual thunk to AController::IsFollowingAPath() const
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): >>> referenced by Module.Chaos2.gen.cpp
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): >>> D:/Users/tmi/Documents/Unreal Projects/Chaos2/Intermediate/Build/Android/a/UnrealGame/Shipping/Chaos2/Module.Chaos2.gen.cpp.o:(vtable for AChaos2PlayerController)
PackagingResults: Error: undefined symbol: non-virtual thunk to AController::GetNavAgentPropertiesRef() const
PackagingResults: Error: undefined symbol: non-virtual thunk to AController::GetNavAgentLocation() const
PackagingResults: Error: undefined symbol: non-virtual thunk to AController::GetMoveGoalReachTest(AActor const*, UE::Math::TVector const&, UE::Math::TVector&, float&, float&) const
PackagingResults: Error: undefined symbol: non-virtual thunk to AController::ShouldPostponePathUpdates() const
PackagingResults: Error: undefined symbol: non-virtual thunk to AController::IsFollowingAPath() const
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): ld.lld: error: undefined symbol: non-virtual thunk to AController::GetPathFollowingAgent() const
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): >>> referenced by Module.Chaos2.gen.cpp
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): >>> D:/Users/tmi/Documents/Unreal Projects/Chaos2/Intermediate/Build/Android/a/UnrealGame/Shipping/Chaos2/Module.Chaos2.gen.cpp.o:(vtable for AChaos2PlayerController)
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): ld.lld: error: undefined symbol: non-virtual thunk to APlayerController::GetStreamingSource(FWorldPartitionStreamingSource&) const
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): >>> referenced by Module.Chaos2.gen.cpp
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): >>> D:/Users/tmi/Documents/Unreal Projects/Chaos2/Intermediate/Build/Android/a/UnrealGame/Shipping/Chaos2/Module.Chaos2.gen.cpp.o:(vtable for AChaos2PlayerController)
PackagingResults: Error: undefined symbol: non-virtual thunk to AController::GetPathFollowingAgent() const
PackagingResults: Error: undefined symbol: non-virtual thunk to APlayerController::GetStreamingSource(FWorldPartitionStreamingSource&) const
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): ld.lld: error: undefined symbol: non-virtual thunk to APlayerController::GetStreamingSources(TArray<FWorldPartitionStreamingSource, TSizedDefaultAllocator<32> >&) const
UATHelper: Packaging (Android (Multi:ASTC,DXT,ETC2)): >>> referenced by Module.Chaos2.gen.cpp

Hello there @tom_m!

Checking through your log, the errors you are encountering have popped up around the community in similar cases. These “non-virtual thunk” errors are occurring because the linker can’t find the implementations of particular virtual functions in the AController and APlayerController classes.

The solution in most of these scenarios, was tied to eliminating any stale or mismatched intermediate files, so performing a clear cache is the best approach:

  • Close Unreal Editor
  • Delete the Binaries, Intermediate, and Saved folders from your project
  • Right-click your .uproject file and select “Generate Visual Studio project files”
  • Rebuild the project

The next step would be to make sure your Android setup is correct, and follows UE requirements:

  • Ensure that your SDK/NDK versions are correct for UE 5.6
  • Verify your Android SDK/NDK paths in Project Settings
  • Test switching between different Android architectures (arm64 vs armv7)

Further details can be found in the community’s documentation:

Alternatively, you can test with different pack settings for your build:

  • Enable “Package game data inside .apk”
  • Disable “Allow large OBB files”