UE5 protobuf

protobuf:Releases · protocolbuffers/protobuficon-default.png?t=O83Ahttps://github.com/protocolbuffers/protobuf/releases

解压后默认third_party\abseil-cpp默认为空,需要下载第三方模块

Releases · abseil/abseil-cppicon-default.png?t=O83Ahttps://github.com/abseil/abseil-cpp/releases

错误

解决方法

取消勾选

错误

解决方法

勾选

cmake版本错误

修改third_party\utf8_range\CMakeLists.txt

第一行

cmake_minimum_required (VERSION 3.5)

改为

3.26为cmake的版本

cmake_minimum_required (VERSION 3.5...3.26)

protobuf CMakeLists.txt

set (CMAKE_CXX_STANDARD 17)
set (CMAKE_CXX_STANDARD_REQUIRED ON)
cmake_minimum_required(VERSION 3.10...3.26)

vs里编译代码成功后,在build目录下执行 

cmake --install . 

在 C:\Program Files (x86)\protobuf下

UE端新建第三方库插件

将include和lib拷贝到模块下

build.cs

// Fill out your copyright notice in the Description page of Project Settings.

using System.IO;
using UnrealBuildTool;

public class SimProtobufLibrary : ModuleRules
{
	public SimProtobufLibrary(ReadOnlyTargetRules Target) : base(Target)
	{
		Type = ModuleType.External;
		PublicSystemIncludePaths.Add(Path.Combine(ModuleDirectory, "include"));

		if (Target.Platform == UnrealTargetPlatform.Win64)
		{
			PublicSystemLibraryPaths.Add(Path.Combine(ModuleDirectory, "lib", "Windows"));
			PublicIncludePaths.Add(Path.Combine(ModuleDirectory, "include"));
			PublicSystemLibraries.Add("absl_bad_any_cast_impl.lib");
			PublicSystemLibraries.Add("absl_bad_optional_access.lib");
			PublicSystemLibraries.Add("absl_bad_variant_access.lib");
			PublicSystemLibraries.Add("absl_base.lib");
			PublicSystemLibraries.Add("absl_city.lib");
			PublicSystemLibraries.Add("absl_civil_time.lib");
			PublicSystemLibraries.Add("absl_cord.lib");
			PublicSystemLibraries.Add("absl_cordz_functions.lib");
			PublicSystemLibraries.Add("absl_cordz_handle.lib");
			PublicSystemLibraries.Add("absl_cordz_info.lib");
			PublicSystemLibraries.Add("absl_cordz_sample_token.lib");
			PublicSystemLibraries.Add("absl_cord_internal.lib");
			PublicSystemLibraries.Add("absl_crc32c.lib");
			PublicSystemLibraries.Add("absl_crc_cord_state.lib");
			PublicSystemLibraries.Add("absl_crc_cpu_detect.lib");
			PublicSystemLibraries.Add("absl_crc_internal.lib");
			PublicSystemLibraries.Add("absl_debugging_internal.lib");
			PublicSystemLibraries.Add("absl_decode_rust_punycode.lib");
			PublicSystemLibraries.Add("absl_demangle_internal.lib");
			PublicSystemLibraries.Add("absl_demangle_rust.lib");
			PublicSystemLibraries.Add("absl_die_if_null.lib");
			PublicSystemLibraries.Add("absl_examine_stack.lib");
			PublicSystemLibraries.Add("absl_exponential_biased.lib");
			PublicSystemLibraries.Add("absl_failure_signal_handler.lib");
			PublicSystemLibraries.Add("absl_flags_commandlineflag.lib");
			PublicSystemLibraries.Add("absl_flags_commandlineflag_internal.lib");
			PublicSystemLibraries.Add("absl_flags_config.lib");
			PublicSystemLibraries.Add("absl_flags_internal.lib");
			PublicSystemLibraries.Add("absl_flags_marshalling.lib");
			PublicSystemLibraries.Add("absl_flags_parse.lib");
			PublicSystemLibraries.Add("absl_flags_private_handle_accessor.lib");
			PublicSystemLibraries.Add("absl_flags_program_name.lib");
			PublicSystemLibraries.Add("absl_flags_reflection.lib");
			PublicSystemLibraries.Add("absl_flags_usage.lib");
			PublicSystemLibraries.Add("absl_flags_usage_internal.lib");
			PublicSystemLibraries.Add("absl_graphcycles_internal.lib");
			PublicSystemLibraries.Add("absl_hash.lib");
			PublicSystemLibraries.Add("absl_hashtablez_sampler.lib");
			PublicSystemLibraries.Add("absl_int128.lib");
			PublicSystemLibraries.Add("absl_kernel_timeout_internal.lib");
			PublicSystemLibraries.Add("absl_leak_check.lib");
			PublicSystemLibraries.Add("absl_log_entry.lib");
			PublicSystemLibraries.Add("absl_log_flags.lib");
			PublicSystemLibraries.Add("absl_log_globals.lib");
			PublicSystemLibraries.Add("absl_log_initialize.lib");
			PublicSystemLibraries.Add("absl_log_internal_check_op.lib");
			PublicSystemLibraries.Add("absl_log_internal_conditions.lib");
			PublicSystemLibraries.Add("absl_log_internal_fnmatch.lib");
			PublicSystemLibraries.Add("absl_log_internal_format.lib");
			PublicSystemLibraries.Add("absl_log_internal_globals.lib");
			PublicSystemLibraries.Add("absl_log_internal_log_sink_set.lib");
			PublicSystemLibraries.Add("absl_log_internal_message.lib");
			PublicSystemLibraries.Add("absl_log_internal_nullguard.lib");
			PublicSystemLibraries.Add("absl_log_internal_proto.lib");
			PublicSystemLibraries.Add("absl_log_severity.lib");
			PublicSystemLibraries.Add("absl_log_sink.lib");
			PublicSystemLibraries.Add("absl_low_level_hash.lib");
			PublicSystemLibraries.Add("absl_malloc_internal.lib");
			PublicSystemLibraries.Add("absl_periodic_sampler.lib");
			PublicSystemLibraries.Add("absl_poison.lib");
			PublicSystemLibraries.Add("absl_random_distributions.lib");
			PublicSystemLibraries.Add("absl_random_internal_distribution_test_util.lib");
			PublicSystemLibraries.Add("absl_random_internal_platform.lib");
			PublicSystemLibraries.Add("absl_random_internal_pool_urbg.lib");
			PublicSystemLibraries.Add("absl_random_internal_randen.lib");
			PublicSystemLibraries.Add("absl_random_internal_randen_hwaes.lib");
			PublicSystemLibraries.Add("absl_random_internal_randen_hwaes_impl.lib");
			PublicSystemLibraries.Add("absl_random_internal_randen_slow.lib");
			PublicSystemLibraries.Add("absl_random_internal_seed_material.lib");
			PublicSystemLibraries.Add("absl_random_seed_gen_exception.lib");
			PublicSystemLibraries.Add("absl_random_seed_sequences.lib");
			PublicSystemLibraries.Add("absl_raw_hash_set.lib");
			PublicSystemLibraries.Add("absl_raw_logging_internal.lib");
			PublicSystemLibraries.Add("absl_scoped_set_env.lib");
			PublicSystemLibraries.Add("absl_spinlock_wait.lib");
			PublicSystemLibraries.Add("absl_stacktrace.lib");
			PublicSystemLibraries.Add("absl_status.lib");
			PublicSystemLibraries.Add("absl_statusor.lib");
			PublicSystemLibraries.Add("absl_strerror.lib");
			PublicSystemLibraries.Add("absl_strings.lib");
			PublicSystemLibraries.Add("absl_strings_internal.lib");
			PublicSystemLibraries.Add("absl_string_view.lib");
			PublicSystemLibraries.Add("absl_str_format_internal.lib");
			PublicSystemLibraries.Add("absl_symbolize.lib");
			PublicSystemLibraries.Add("absl_synchronization.lib");
			PublicSystemLibraries.Add("absl_throw_delegate.lib");
			PublicSystemLibraries.Add("absl_time.lib");
			PublicSystemLibraries.Add("absl_time_zone.lib");
			PublicSystemLibraries.Add("absl_utf8_for_code_point.lib");
			PublicSystemLibraries.Add("absl_vlog_config_internal.lib");
			PublicSystemLibraries.Add("libprotobuf-lite.lib");
			PublicSystemLibraries.Add("libprotobuf.lib");
			PublicSystemLibraries.Add("libprotoc.lib");
			PublicSystemLibraries.Add("libupb.lib");
			PublicSystemLibraries.Add("utf8_range.lib");
			PublicSystemLibraries.Add("utf8_validity.lib");
		}
		
	}
}

<think>我们正在处理一个关于在UE5插件中引入Protobuf的查询。根据提供的引用,特别是引用[1]和引用[3],我们可以总结出以下关键步骤: 引用[1]提到:通过直接集成Protobuf的源码,成功将其与UE5项目结合,并解决了兼容性问题。同时提到了下载源码这一步骤。 引用[3]详细描述了使用vcpkg来构建protobuf库,并将生成的库文件和头文件复制到UE工程中,还提到了protoc.exe的使用。 结合这些信息,我们可以推断在UE5插件中引入Protobuf的一般步骤包括: 1. 获取Protobuf源码(通过下载或使用包管理器如vcpkg)。 2. 构建Protobuf库(生成适合UE5的库文件)。 3. 将构建得到的库文件和头文件集成到UE5插件项目中。 4. 配置UE5项目以使用这些库(修改构建文件等)。 5. 使用protoc编译器生成C++代码(用于序列化和反序列化)。 此外,由于UE5有自己的一套构建系统,可能需要特别注意构建Protobuf库时使用的配置(如运行时库、链接方式等)要与UE5项目匹配。 因此,回答将围绕这些步骤展开,并尽量结合引用中的实践经验。 </think>基于提供的引用信息,在UE5插件中集成Protobuf的完整步骤如下: ### 一、源码获取与编译 1. **下载源码** 从官方仓库获取最新Protobuf源码(推荐v3.19+版本)[^1] ```bash git clone https://github.com/protocolbuffers/protobuf.git ``` 2. **使用vcpkg构建** ```bash vcpkg install protobuf:x64-windows # Windows平台 vcpkg install protobuf:x64-linux # Linux平台 ``` 构建完成后,在`vcpkg/packages/`目录生成: - 头文件:`include/protobuf/*.h` - 库文件:`lib/*.lib` (Windows) 或 `lib/*.a` (Linux) - 编译器:`tools/protobuf/protoc.exe`[^3] ### 二、UE5插件集成 1. **文件组织结构** 在插件目录创建: ``` YourPlugin/ ├── ThirdParty/ │ ├── Protobuf/ │ ├── include/ # 放入所有头文件 │ ├── lib/ # 放入.lib/.a文件 │ └── bin/ # 放入protoc可执行文件 └── Source/ └── YourPlugin.Build.cs ``` 2. **修改构建脚本(YourPlugin.Build.cs)** ```csharp public class YourPlugin : ModuleRules { public YourPlugin(ReadOnlyTargetRules Target) : base(Target) { // 添加头文件路径 PublicIncludePaths.Add(Path.Combine(ModuleDirectory, "ThirdParty/Protobuf/include")); // 链接库配置 if (Target.Platform == UnrealTargetPlatform.Win64) { PublicAdditionalLibraries.Add(Path.Combine(ModuleDirectory, "ThirdParty/Protobuf/lib/libprotobuf.lib")); } else if (Target.Platform == UnrealTargetPlatform.Linux) { PublicAdditionalLibraries.Add(Path.Combine(ModuleDirectory, "ThirdParty/Protobuf/lib/libprotobuf.a")); } } } ``` ### 三、协议文件编译 1. **创建`.proto`文件** 在插件目录存储协议定义(如`NetworkProto.proto`) 2. **生成C++代码** 使用protoc生成序列化代码: ```bash protoc --cpp_out=./Source/YourPlugin/Public/ ./NetworkProto.proto ``` 生成文件:`NetworkProto.pb.h` 和 `NetworkProto.pb.cc` ### 四、兼容性处理 1. **禁用预编译头** 在`.pb.cc`文件首行添加: ```cpp #undef NO_PROTOBUF_DEPRECATED // 避免UE头文件冲突 #include "NetworkProto.pb.h" ``` 2. **运行时库配置** 确保ProtobufUE5使用相同的运行时库(MT/MTd),可通过vcpkg的triplet文件调整: ```cmake set(VCPKG_CRT_LINKAGE static) # 静态链接运行时库 ``` ### 五、使用示例 ```cpp // 在插件代码中使用 #include "NetworkProto.pb.h" void SerializeData() { NetworkProto::PlayerData Data; Data.set_id(1001); Data.set_name("Player1"); std::string BinaryBuffer; Data.SerializeToString(&BinaryBuffer); // 序列化 } ``` > **重要提示**:某些UE版本需要关闭`bEnableUndefinedIdentifierWarnings`避免编译警告,在`.Build.cs`中添加: > `bEnableUndefinedIdentifierWarnings = false;`
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值