keywords: [UE4]静态链接Protobuf 3.x版本的错误

3.5版本编译问题

UE4集成Protobuf 3.5版本时的一些问题
错误:wire_format_lite.h(863): error C4146: unary minus operator applied to unsigned type, result still unsigned
解决办法:disable warning或者切换到3.4版本

错误: type_traits(605): error C4647: behavior change: __is_pod(google::protobuf::internal::AuxillaryParseTableField) has different value in previous versions

解决办法:
修改generated_messages_table_driven.h
static_assert(std::is_pod<AuxillaryParseTableField>::value, "");注释掉

3.5之后版本编译

如果使用3.x,将protoc生成的代码打成lib链接到UE4工程时,会出现以下错误(当template文件中有string字段时会报错,如果没有string可以编译通过):

2>TestTDGameMode.cpp.obj : error LNK2019: unresolved external symbol "public: void __cdecl my_proto::login_info::set_account(char const *)" (?set_account@login_info@fh_proto@@QEAAXPEBD@Z) referenced in function "public: virtual void __cdecl ATestTDGameMode::BeginPlay(void)" (?BeginPlay@ATestTDGameMode@@UEAAXXZ)
2>G:\Source\Work\Game20171205\program\client\TestTD\Binaries\Win64\UE4Editor-TestTD-4710.dll : fatal error LNK1120: 1 unresolved externals

Python脚本对protoc生成代码二次转换,然后与UE4工程编译(Protobuf 3.x) https://github.com/thejinchao/libprotobuf
https://thecodeway.com/blog/?p=1394

BAT脚本对protobuf官方源码修改以适配UE4编译(强烈推荐
Build Protobuf for Unreal Engine 4 with Jenkins Pipeline.
https://github.com/kingsoftgames/protobuf-ue4

修改Protobuf 3.x源码并作为UE4 plugin编译
https://github.com/jashking/UE4Protobuf
我基于该项目的protobuf代码,做了一个cmake自动构建配置:
https://github.com/dawnarc/protobuf_ue4_cmake

将protobuf3.x作为插件集成进UE4
https://github.com/marshal-it/Protobuffer_UE4

如果使用protobuf 2.x版本,可以不用修改任何代码,直接作为一个lib链接UE4工程。

2020年7月更新

如果是protobuf 3.9.x之前的版本,需要按照以下方式对源码做多处修改:
https://github.com/jashking/UE4Protobuf

3.9.x及之后的版本,只需要按照以下脚本执行即可:
https://github.com/kingsoftgames/protobuf-ue4

3.12.x 版本已经不需要做改动。


景色如冬
萧瑟如枫
攻势如弓
魂断犹如梦中
----《黄金甲》