UE4+Protobuf
需要把protobuf 源码直接复制到UE4c++项目里面
修改 libprotobuf 源码
主要是去掉两个宏开关 GOOGLE_PROTOBUF_NO_RTTI
和 HAVE_PTHREAD
去掉 HAVE_PTHREAD 宏
在非 Windows
平台下都要打开 HAVE_PTHREAD
宏
打开 google/protobuf/stubs/common.cc
,把两个地方的 elif defined(HAVE_PTHREAD)
改成 #else
并且把第一处以下两行代码删除
#else #error "No suitable threading library available."
去掉 GOOGLE_PROTOBUF_NO_RTTI 宏
在所有平台下都要禁用 RTTI
,因为 UE4
禁用了 C++
的运行时类型识别(typeid
和 dynamic_cast
)
打开 google/protobuf/arena.h
,将
#ifndef GOOGLE_PROTOBUF_NO_RTTI #define RTTI_TYPE(type) (&typeid(type)) #else #define RTTI_TYPE_ID(type) (NULL) #endif
改为
#define RTTI_TYPE_ID(type) (NULL)
打开google/protobuf/generated_message_reflection.h
,将
#if defined(GOOGLE_PROTOBUF_NO_RTTI) || (defined(_MSC_VER)&&!defined(_CPPRTTI)) return NULL; #else return dynamic_cast<To>(from); #endif
改为
return NULL;
将
#if defined(GOOGLE_PROTOBUF_NO_RTTI) || (defined(_MSC_VER)&&!defined(_CPPRTTI)) bool ok = &T::default_instance9) == from->GetReflection()->GetMessageFactory()->GetPrototype(from->GetDescriptor()); return ok ? down_cast<T*>(from) : NULL; #else return dynamic_cast<To>(from); #endif
改为
bool ok = &T::default_instance9) == from->GetReflection()->GetMessageFactory()->GetPrototype(from->GetDescriptor()); return ok ? down_cast<T*>(from) : NULL;
打开google/protobuf/stubs/casts.h
,删除以下两处代码
#if !defined(NDEBUG) && !defined(GOOGLE_PROTOBUF_NO_RTTI) assert(f == NULL || dynamic_cast<To>(f) != NULL); // RTTI: debug mode only! #endif
#if !defined(NDEBUG) && !defined(GOOGLE_PROTOBUF_NO_RTTI) // RTTI: debug mode only! assert(dynamic_cast<ToAsPointer>(&f) != NULL); #endif
禁用编译警告
因为 UE4
会将一些编译警告当成错误,所以要将编译过程中 libprotobuf
中的警告禁用掉
转载:https://github.com/jashking/UE4Protobuf