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;额外检查项
- 确保你的
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); }; - 清理项目的
Binaries、Intermediate文件夹,重新生成解决方案并编译,清除旧编译缓存的影响。
- 确保你的
内容的提问来源于stack exchange,提问作者Liyuu_
相关产品推荐
相关产品推荐

