[SOLVED]LNK2019/2001 errors with Gameplay Tags used across custom modules

Update: found solution

For LNK2019

In Modules.Build.cs add GameplayTags to the PublicDependencyModuleNames
Modules.Build.cs

// Copyright Epic Games, Inc. All Rights Reserved.

using UnrealBuildTool;

public class Modules : ModuleRules
{
	public Modules(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
	
		PublicDependencyModuleNames.AddRange(new string[]
		{
			"Core",
			"CoreUObject",
			"Engine",
			"InputCore",
			"EnhancedInput",
			"GameplayTags",
			"TagsModule"
		});

		PrivateDependencyModuleNames.AddRange(new string[] {  });

		// Uncomment if you are using Slate UI
		// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
		
		// Uncomment if you are using online features
		// PrivateDependencyModuleNames.Add("OnlineSubsystem");

		// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
	}
}

For LNK2001

Add <ModuleName>_API (in my case TagsModule_API) before UE_DECLARE_GAMEPLAY_TAG_EXTERN and UE_DEFINE_GAMEPLAY_TAG macros
Tags.h

#pragma once

#include "CoreMinimal.h"
#include "NativeGameplayTags.h"

TAGSMODULE_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(TAG_Test);

Tags.cpp

#include "Tags.h"

TAGSMODULE_API UE_DEFINE_GAMEPLAY_TAG(TAG_Test,"Test");

Problem

I’m encountering LNK2019 and LNK2001 errors when using gameplay tags declared and defined in one custom module (TagsModule in my case) and used in another (Modules).

LNK2019
MyActor.cpp.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __cdecl FGameplayTagContainer::AddTag(struct FGameplayTag const &)" (__imp_?AddTag@FGameplayTagContainer@@QEAAXAEBUFGameplayTag@@@Z) referenced in function "public: __cdecl AMyActor::AMyActor(void)" (??0AMyActor@@QEAA@XZ)
LNK2001
MyActor.cpp.obj : error LNK2001: unresolved external symbol "class FNativeGameplayTag TAG_Test" (?TAG_Test@@3VFNativeGameplayTag@@A)
UnrealBuildTool/Log.txt
Log started at 05/20/2025 21:54:34 (2025-05-20T16:54:34Z)
No config file at C:\ProgramData\Unreal Engine\UnrealBuildTool\BuildConfiguration.xml
No config file at C:\Users\admin\AppData\Local\Unreal Engine\UnrealBuildTool\BuildConfiguration.xml
Configuration will be read from:
  C:\Users\admin\AppData\Roaming\Unreal Engine\UnrealBuildTool\BuildConfiguration.xml
Setting temp directory to 'C:\Users\admin\AppData\Local\Temp\UnrealBuildTool\619b1ae5'
    Registering build platform: UnrealBuildTool.AndroidPlatformFactory
    Registering build platform: UnrealBuildTool.IOSPlatformFactory
    Registering build platform: UnrealBuildTool.LinuxPlatformFactory
    Registering build platform: UnrealBuildTool.MacPlatformFactory
    Registering build platform: UnrealBuildTool.TVOSPlatformFactory
    Registering build platform: UnrealBuildTool.WindowsPlatformFactory
Found Windows 10 SDK root at C:\Program Files (x86)\Windows Kits\10 (1)
Found Windows 10 SDK root at C:\Program Files (x86)\Windows Kits\10 (2)
Found Windows 10 SDK version 10.0.22621.0 at C:\Program Files (x86)\Windows Kits\10
Found Universal CRT version 10.0.22621.0 at C:\Program Files (x86)\Windows Kits\10
Found Windows 10 SDK version 10.0.26100.0 at C:\Program Files (x86)\Windows Kits\10
Found Universal CRT version 10.0.26100.0 at C:\Program Files (x86)\Windows Kits\10
Win64 Installed SDK(s): MinVersion_Sdk=10.0.19041.0, MaxVersion_Sdk=10.9.99999.0, CurrentVersion_Sdk=10.0.22621.0, Version_AutoSdk=10.0.22621.0, CurrentVersion_AutoSdk=
        Registering build platform: Win64 - buildable: True
    Registering build platform: UnrealBuildTool.VisionOSPlatformFactory
Command line: "E:\Unreal Engine\UE_5.5\Engine\Binaries\DotNET\UnrealBuildTool\UnrealBuildTool.dll" ModulesEditor Win64 Development "-Project=E:\Unreal Engine\Projects\Modules\Modules.uproject" -WaitMutex -FromMsBuild -architecture=x64
Log file: C:\Users\admin\AppData\Local\UnrealBuildTool\Log.txt
Deleting old log file: C:\Users\admin\AppData\Local\UnrealBuildTool\Log-backup-2024.05.06-13.41.49.txt

Generated code is up to date.
UnrealEditor-Modules.dll: Produced item "E:\Unreal Engine\Projects\Modules\Binaries\Win64\UnrealEditor-Modules.dll" doesn't exist.
ModulesEditor.target: Prerequisite E:\Unreal Engine\Projects\Modules\Binaries\Win64\UnrealEditor-Modules.dll doesn't exist.
UnrealEditor-Modules.dll: Produced item "E:\Unreal Engine\Projects\Modules\Binaries\Win64\UnrealEditor-Modules.pdb" doesn't exist.
Checking for live coding mutex: Global\LiveCoding_E++Unreal Engine+UE_5.5+Engine+Binaries+Win64+UnrealEditor.exe
Building ModulesEditor...
Using Visual Studio 2022 14.38.33144 toolchain (D:\Programs\VisualStudioMisc\Visual Studio Community\VC\Tools\MSVC\14.38.33130) and Windows 10.0.22621.0 SDK (C:\Program Files (x86)\Windows Kits\10).
Executing up to 16 actions based on MaxProcessorCount override
Using Unreal Build Accelerator local executor to run 2 action(s)
  Storage capacity 40Gb
Deleting old log file: C:\Users\admin\AppData\Local\UnrealBuildTool\Log-backup-2025.05.20-15.56.17.uba
---- Starting trace: 250520_215434 ----
UbaSessionServer - Disable remote execution (remote sessions will finish current processes)
------ Building 2 action(s) started ------
[1/2] Link [x64] UnrealEditor-Modules.dll
   Creating object E:\Unreal Engine\Projects\Modules\Binaries\Win64\UnrealEditor-Modules.exp
MyActor.cpp.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __cdecl FGameplayTagContainer::AddTag(struct FGameplayTag const &)" (__imp_?AddTag@FGameplayTagContainer@@QEAAXAEBUFGameplayTag@@@Z) referenced in function "public: __cdecl AMyActor::AMyActor(void)" (??0AMyActor@@QEAA@XZ)
MyActor.cpp.obj : error LNK2001: unresolved external symbol "class FNativeGameplayTag TAG_Test" (?TAG_Test@@3VFNativeGameplayTag@@A)
E:\Unreal Engine\Projects\Modules\Binaries\Win64\UnrealEditor-Modules.dll : fatal error LNK1120: 2 unresolved externals
 Link [x64] UnrealEditor-Modules.dll: Exited with error code 1120 . The build will fail.
 Link [x64] UnrealEditor-Modules.dll: WorkingDirectory E:\Unreal Engine\UE_5.5\Engine\Source
 Link [x64] UnrealEditor-Modules.dll: D:\Programs\VisualStudioMisc\Visual Studio Community\VC\Tools\MSVC\14.38.33130\bin\Hostx64\x64\link.exe @"E:\Unreal Engine\Projects\Modules\Intermediate\Build\Win64\x64\UnrealEditor\Development\Modules\UnrealEditor-Modules.dll.rsp"
Trace file written to C:/Users/admin/AppData/Local/UnrealBuildTool/Log.uba with size 3.1kb
Total time in Unreal Build Accelerator local executor: 1.11 seconds
Total execution time: 1.83 seconds
CompilationResultException: OtherCompilationError
   at UnrealBuildTool.ActionGraph.ExecuteActionsAsync(BuildConfiguration BuildConfiguration, List`1 ActionsToExecute, List`1 TargetDescriptors, ILogger Logger, IActionArtifactCache actionArtifactCache) in E:\Unreal Engine\UE_5.5\Engine\Source\Programs\UnrealBuildTool\System\ActionGraph.cs:line 471
   at UnrealBuildTool.BuildMode.BuildAsync(TargetMakefile[] Makefiles, List`1 TargetDescriptors, BuildConfiguration BuildConfiguration, BuildOptions Options, FileReference WriteOutdatedActionsFile, ILogger Logger, String ActionTypeFilter) in E:\Unreal Engine\UE_5.5\Engine\Source\Programs\UnrealBuildTool\Modes\BuildMode.cs:line 825
   at UnrealBuildTool.BuildMode.BuildAsync(List`1 TargetDescriptors, BuildConfiguration BuildConfiguration, ISourceFileWorkingSet WorkingSet, BuildOptions Options, FileReference WriteOutdatedActionsFile, ILogger Logger, Boolean bSkipPreBuildTargets, String ActionTypeFilter) in E:\Unreal Engine\UE_5.5\Engine\Source\Programs\UnrealBuildTool\Modes\BuildMode.cs:line 417
   at UnrealBuildTool.BuildMode.ExecuteAsync(CommandLineArguments Arguments, ILogger Logger) in E:\Unreal Engine\UE_5.5\Engine\Source\Programs\UnrealBuildTool\Modes\BuildMode.cs:line 257
   at UnrealBuildTool.UnrealBuildTool.Main(String[] ArgumentsArray) in E:\Unreal Engine\UE_5.5\Engine\Source\Programs\UnrealBuildTool\UnrealBuildTool.cs:line 687
WriteFileIfChanged() wrote 0 changed files of 0 requested writes.
Timeline:

[ 0.000]
[ 0.000](+1.844) <unknown>
[ 1.844]

Project Setup

  • UE version: 5.5.4
  • Project structure

Code

Modules

Actor.h
#pragma once

#include "CoreMinimal.h"
#include "GameplayTagContainer.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"

UCLASS()
class MODULES_API AMyActor : public AActor
{
	GENERATED_BODY()
	
public:
	AMyActor();

	FGameplayTagContainer TagContainer;
};
Actor.cpp
#include "MyActor.h"
#include "Tags.h"

AMyActor::AMyActor()
{
	TagContainer.AddTag(TAG_Test);
}
Modules.h
#pragma once

#include "CoreMinimal.h"
Modules.cpp
#include "Modules.h"
#include "Modules/ModuleManager.h"

IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, Modules, "Modules" );
Modules.Build.cs
using UnrealBuildTool;

public class Modules : ModuleRules
{
	public Modules(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
	
		PublicDependencyModuleNames.AddRange(new string[]
		{
			"Core",
			"CoreUObject",
			"Engine",
			"InputCore",
			"EnhancedInput",
			"TagsModule"
		});

		PrivateDependencyModuleNames.AddRange(new string[] {  });

		// Uncomment if you are using Slate UI
		// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
		
		// Uncomment if you are using online features
		// PrivateDependencyModuleNames.Add("OnlineSubsystem");

		// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
	}
}

TagsModule

Tags.h
#pragma once

#include "CoreMinimal.h"
#include "NativeGameplayTags.h"

UE_DECLARE_GAMEPLAY_TAG_EXTERN(TAG_Test);
Tags.cpp
#include "Tags.h"

UE_DEFINE_GAMEPLAY_TAG(TAG_Test, "Test");
TagsModule.h
#pragma once

#include "CoreMinimal.h"
TagsModule.cpp
#include "TagsModule.h"
#include "Modules/ModuleManager.h"

IMPLEMENT_MODULE( FDefaultModuleImpl, TagsModule);
TagsModule.Build.cs
// Copyright Epic Games, Inc. All Rights Reserved.

using UnrealBuildTool;

public class TagsModule : ModuleRules
{
	public TagsModule(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
	
		PublicDependencyModuleNames.AddRange(new string[]
		{
			"Core",
			"CoreUObject",
			"Engine",
			"InputCore",
			"EnhancedInput",
			"GameplayTags"
		});

		PrivateDependencyModuleNames.AddRange(new string[] {  });

		// Uncomment if you are using Slate UI
		// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
		
		// Uncomment if you are using online features
		// PrivateDependencyModuleNames.Add("OnlineSubsystem");

		// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
	}
}

Target.cs and .uproject

Modules.Target.cs
using UnrealBuildTool;
using System.Collections.Generic;

public class ModulesTarget : TargetRules
{
	public ModulesTarget(TargetInfo Target) : base(Target)
	{
		Type = TargetType.Game;
		DefaultBuildSettings = BuildSettingsVersion.V5;
		IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_5;
		ExtraModuleNames.Add("Modules");
		ExtraModuleNames.Add("TagsModule");
	}
}

ModulesEditor.Target.cs
using UnrealBuildTool;
using System.Collections.Generic;

public class ModulesEditorTarget : TargetRules
{
	public ModulesEditorTarget( TargetInfo Target) : base(Target)
	{
		Type = TargetType.Editor;
		DefaultBuildSettings = BuildSettingsVersion.V5;
		IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_5;
		ExtraModuleNames.Add("Modules");
		ExtraModuleNames.Add("TagsModule");
	}
}

Modules.uproject
{
	"FileVersion": 3,
	"EngineAssociation": "5.5",
	"Category": "",
	"Description": "",
	"Modules": [
		{
			"Name": "Modules",
			"Type": "Runtime",
			"LoadingPhase": "Default",
			"AdditionalDependencies": [
				"Engine"
			]
		},
		{
			"Name": "TagsModule",
			"Type": "Runtime",
			"LoadingPhase": "Default"
		}
	],
	"Plugins": [
		{
			"Name": "ModelingToolsEditorMode",
			"Enabled": true,
			"TargetAllowList": [
				"Editor"
			]
		},
		{
			"Name": "GameplayAbilities",
			"Enabled": true
		}
	]
}

What I’ve tried:

  • Adding GameplayTags module to PublicDependencyModuleNames in Modules.Build.cs.
  • Deleting .sln, Saved, Intermediate, DerivedDataCache, Binaries, .vs, .idea folders and then Generate Visual Studio project files.
  • Creating new UE project with different modules names.
  • Creating new module with class that uses tag declared in different module.

Why I think my code should work

  • In NativeGameplayTags.h there’s a comment about macro UE_DECLARE_GAMEPLAY_TAG_EXTERN that “allow other modules or code to use the created tag variable
/**
 * Declares a native gameplay tag that is defined in a cpp with UE_DEFINE_GAMEPLAY_TAG to allow other modules or code to use the created tag variable.
 */
#define UE_DECLARE_GAMEPLAY_TAG_EXTERN(TagName) extern FNativeGameplayTag TagName;
  • I’ve added TagsModule to the Module.Build.cs.

For LNK2019

Add GameplayTags to the PublicDependencyModuleNames inModules.Build.cs
Modules.Build.cs

// Copyright Epic Games, Inc. All Rights Reserved.

using UnrealBuildTool;

public class Modules : ModuleRules
{
	public Modules(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
	
		PublicDependencyModuleNames.AddRange(new string[]
		{
			"Core",
			"CoreUObject",
			"Engine",
			"InputCore",
			"EnhancedInput",
			"GameplayTags",
			"TagsModule"
		});

		PrivateDependencyModuleNames.AddRange(new string[] {  });

		// Uncomment if you are using Slate UI
		// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
		
		// Uncomment if you are using online features
		// PrivateDependencyModuleNames.Add("OnlineSubsystem");

		// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
	}
}

For LNK2001

Add <ModuleName>_API (in my case TagsModule_API) before UE_DECLARE_GAMEPLAY_TAG_EXTERN and UE_DEFINE_GAMEPLAY_TAG macros
Tags.h

#pragma once

#include "CoreMinimal.h"
#include "NativeGameplayTags.h"

TAGSMODULE_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(TAG_Test);

Tags.cpp

#include "Tags.h"

TAGSMODULE_API UE_DEFINE_GAMEPLAY_TAG(TAG_Test,"Test");