Search code examples
c++unreal-engine4

UE4 LNK2001 Error when deriving from K2Node_AnimGetter



I am trying to derive from K2Node_AnimGetter to add some functionality to it. However I get some unresolved external symbol LNK2001 errors when I try to compile it.

I have no problem to compile when deriving from K2Node_CallFunction (from what AnimGetter derive itself).
I tried to include some dependencies like AnimGraph in the MyGameEditor.Build.cs but with no result...

Am I missing something ?

K2Node_MyAnimGetter.h

#pragma once

#include "CoreMinimal.h"
#include "K2Node_AnimGetter.h"
#include "K2Node_MyAnimGetter.generated.h"

UCLASS()
class MYGAMEEDITOR_API UK2Node_MyAnimGetter : public UK2Node_AnimGetter
{
    GENERATED_BODY()
};

K2Node_MyAnimGetter.cpp

#include "K2Node_MyAnimGetter.h"
// nothing else since my class is empty

MyGameEditor.Build.cs

using UnrealBuildTool;

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

        PrivateDependencyModuleNames.AddRange(new string[] { "Engine", "UnrealEd", "BlueprintGraph", "AnimGraph", "AnimGraphRunTime", "KismetCompiler" });
    }
}

Error logs :

1>K2Node_MyAnimGetter.cpp.obj : error LNK2001: symbole externe non resolu "public: virtual void __cdecl UK2Node_AnimGetter::Serialize(class FArchive &)" (?Serialize@UK2Node_AnimGetter@@UEAAXAEAVFArchive@@@Z)
1>K2Node_MyAnimGetter.gen.cpp.obj : error LNK2001: symbole externe non resolu "public: virtual void __cdecl UK2Node_AnimGetter::Serialize(class FArchive &)" (?Serialize@UK2Node_AnimGetter@@UEAAXAEAVFArchive@@@Z)
1>K2Node_MyAnimGetter.cpp.obj : error LNK2001: symbole externe non resolu "public: virtual void __cdecl UK2Node_AnimGetter::PostPasteNode(void)" (?PostPasteNode@UK2Node_AnimGetter@@UEAAXXZ)
1>K2Node_MyAnimGetter.gen.cpp.obj : error LNK2001: symbole externe non resolu "public: virtual void __cdecl UK2Node_AnimGetter::PostPasteNode(void)" (?PostPasteNode@UK2Node_AnimGetter@@UEAAXXZ)
1>K2Node_MyAnimGetter.cpp.obj : error LNK2001: symbole externe non resolu "public: virtual void __cdecl UK2Node_AnimGetter::AllocateDefaultPins(void)" (?AllocateDefaultPins@UK2Node_AnimGetter@@UEAAXXZ)
1>K2Node_MyAnimGetter.gen.cpp.obj : error LNK2001: symbole externe non resolu "public: virtual void __cdecl UK2Node_AnimGetter::AllocateDefaultPins(void)" (?AllocateDefaultPins@UK2Node_AnimGetter@@UEAAXXZ)
1>K2Node_MyAnimGetter.cpp.obj : error LNK2001: symbole externe non resolu "public: virtual class FText __cdecl UK2Node_AnimGetter::GetNodeTitle(enum ENodeTitleType::Type)const " (?GetNodeTitle@UK2Node_AnimGetter@@UEBA?AVFText@@W4Type@ENodeTitleType@@@Z)
1>K2Node_MyAnimGetter.gen.cpp.obj : error LNK2001: symbole externe non resolu "public: virtual class FText __cdecl UK2Node_AnimGetter::GetNodeTitle(enum ENodeTitleType::Type)const " (?GetNodeTitle@UK2Node_AnimGetter@@UEBA?AVFText@@W4Type@ENodeTitleType@@@Z)
1>K2Node_MyAnimGetter.cpp.obj : error LNK2001: symbole externe non resolu "public: virtual bool __cdecl UK2Node_AnimGetter::CanCreateUnderSpecifiedSchema(class UEdGraphSchema const *)const " (?CanCreateUnderSpecifiedSchema@UK2Node_AnimGetter@@UEBA_NPEBVUEdGraphSchema@@@Z)
1>K2Node_MyAnimGetter.gen.cpp.obj : error LNK2001: symbole externe non resolu "public: virtual bool __cdecl UK2Node_AnimGetter::CanCreateUnderSpecifiedSchema(class UEdGraphSchema const *)const " (?CanCreateUnderSpecifiedSchema@UK2Node_AnimGetter@@UEBA_NPEBVUEdGraphSchema@@@Z)
1>K2Node_MyAnimGetter.cpp.obj : error LNK2001: symbole externe non resolu "public: virtual bool __cdecl UK2Node_AnimGetter::IsActionFilteredOut(class FBlueprintActionFilter const &)" (?IsActionFilteredOut@UK2Node_AnimGetter@@UEAA_NAEBVFBlueprintActionFilter@@@Z)
1>K2Node_MyAnimGetter.gen.cpp.obj : error LNK2001: symbole externe non resolu "public: virtual bool __cdecl UK2Node_AnimGetter::IsActionFilteredOut(class FBlueprintActionFilter const &)" (?IsActionFilteredOut@UK2Node_AnimGetter@@UEAA_NAEBVFBlueprintActionFilter@@@Z)
1>K2Node_MyAnimGetter.cpp.obj : error LNK2001: symbole externe non resolu "public: virtual void __cdecl UK2Node_AnimGetter::GetMenuActions(class FBlueprintActionDatabaseRegistrar &)const " (?GetMenuActions@UK2Node_AnimGetter@@UEBAXAEAVFBlueprintActionDatabaseRegistrar@@@Z)
1>K2Node_MyAnimGetter.gen.cpp.obj : error LNK2001: symbole externe non resolu "public: virtual void __cdecl UK2Node_AnimGetter::GetMenuActions(class FBlueprintActionDatabaseRegistrar &)const " (?GetMenuActions@UK2Node_AnimGetter@@UEBAXAEAVFBlueprintActionDatabaseRegistrar@@@Z)
1>R:\SVN\MyGame\Binaries\Win64\UE4Editor-MyGameEditor.dll : fatal error LNK1120: 7 externes non resolus

Solution

  • If you look into the UK2Node_AnimGetter class you will notice that it is UCLASS(MinimalAPI). This means that the class is accessible outside of its Module, but its internal functions are not exported.

    You will also notice that all of the functions with linker errors are virtual override. By overriding these functions you maybe able to export them manually and thus fix the linking errors.