You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UE4中调用GetAssetTools()出现LNK2019链接错误求助

问题描述

我创建了一个继承自AssetActionUtility的C++类,并编写了如下ClipAnimCpp函数:

#include "ClipAnimUtility.h"

#include "EditorUtilityLibrary.h"
#include "IAssetTools.h"
#include "ClipAnimAsset.h"
#include "Kismet/KismetStringLibrary.h"

void UClipAnimUtility::ClipAnimCpp(FString path)
{
    AnimSource = UEditorUtilityLibrary::GetSelectedAssets()[0];
    PackagePath = UEditorUtilityLibrary::GetSelectedAssetData()[0].PackagePath.ToString();

    RowData = UClipAnimAsset::ReadFileArray(path);
    for (auto dataString : RowData)
    {
        FString startFrame{}, endFrame{}, clipName{}, subString{};

        dataString.Split("|", &startFrame, &subString);
        subString.Split("|", &endFrame, &clipName);

        SingleClip.StartFrame = UKismetStringLibrary::Conv_StringToInt(startFrame);
        SingleClip.EndFrame = UKismetStringLibrary::Conv_StringToInt(endFrame);
        SingleClip.ClipName = clipName;

        UAnimSequence* animSeq = Cast<UAnimSequence>(
            UAssetToolsHelpers::GetAssetTools()->DuplicateAsset(SingleClip.ClipName, PackagePath, AnimSource)
            );

        UClipAnimAsset::ClipAnimAsset(animSeq, SingleClip.StartFrame, SingleClip.EndFrame);
    }
}

同时在MyGame.Build.cs中添加了以下依赖模块:

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "AssetTools", "AssetRegistry" });

但仍出现LNK2019链接错误:

ClipAnimUtility.cpp.obj : error LNK2019: unresolved external symbol "public: static class TScriptInterface<class IAssetTools> __cdecl UAssetToolsHelpers::GetAssetTools(void)" (?GetAssetTools@UAssetToolsHelpers@@SA?AV?$TScriptInterface@VIAssetTools@@@@XZ) referenced in function "public: void __cdecl UClipAnimUtility::ClipAnimCpp(class FString)" (?ClipAnimCpp@UClipAnimUtility@@QEAAXVFString@@@Z)

根据文档,UAssetToolsHelpers::GetAssetTools()属于AssetTools模块,我已添加该依赖却仍无法链接相关二进制文件,请问我哪里操作有误?

解决方案

这个链接错误的核心原因是**AssetTools属于编辑器专用模块,仅在编辑器环境下可用**,你的项目配置存在两个关键问题:

  • 模块未标记为编辑器专属
    你的类继承自AssetActionUtility,这是仅在编辑器中运行的类,因此需要在MyGame.Build.cs中明确标记模块为编辑器模块:

    bIsEditorOnly = true;
    
  • 依赖模块的添加位置错误
    AssetTools是编辑器模块,不应放在PublicDependencyModuleNames中,而是要放在PrivateEditorDependencyModuleNames里(避免暴露编辑器依赖给游戏运行时)。修改后的依赖配置如下:

    PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });
    PrivateEditorDependencyModuleNames.AddRange(new string[] { "AssetTools", "AssetRegistry", "EditorUtilityLibrary" });
    bIsEditorOnly = true;
    
  • 额外检查项

    1. 确保你的UClipAnimUtility头文件中,类的UFUNCTION标记为CallInEditor:
      #include "CoreMinimal.h"
      #include "AssetActionUtility.h"
      #include "ClipAnimUtility.generated.h"
      
      UCLASS()
      class MYGAME_API UClipAnimUtility : public UAssetActionUtility
      {
          GENERATED_BODY()
      
      public:
          UFUNCTION(CallInEditor)
          void ClipAnimCpp(FString path);
      };
      
    2. 清理项目的Binaries、Intermediate文件夹,重新生成解决方案并编译,清除旧编译缓存的影响。

内容的提问来源于stack exchange,提问作者Liyuu_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:20:43