标签:一个 fst get tput 资源下载 hub read 根据 工程
1.首先从Github-Protobuf下载代码,本文下载的版本号是3.1.0.
2.仔细查看各个README,有相关的资源下载和编译说明.
3.在一个方便的地方创建一个Install类型的文件夹,放置Cmake生成的工程文件相关内容,使用CMake-gui配置,生成visual studio ide工程.
CMAKE_CONFIGRATION_TYPES是工程配置类型,可以删除不感兴趣的配置.
CMAKE_INSTALL_PREFIX是导出visual studio ide项目文件的位置
根据自己的需求选择BUILD_SHARED_LIBS或者是MSVC_STATIC_RUNTIME(对应编译选项/Mtd和/Mt),二者选其一
4.Open Project直接编译工程.
将生成的protobuf的库引用项目,报如下错误:
1 error LNK2001: 无法解析的外部符号 "class google::protobuf::internal::ExplicitlyConstructed<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > google::protobuf::internal::fixed_address_empty_string" (?fixed_address_empty_string@internal@protobuf@google@@3V?$ExplicitlyConstructed@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@123@A) 2 error LNK2001: 无法解析的外部符号 "class google::protobuf::internal::ExplicitlyConstructed<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > google::protobuf::internal::fixed_address_empty_string" (?fixed_address_empty_string@internal@protobuf@google@@3V?$ExplicitlyConstructed@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@123@A) 3 error LNK2001: 无法解析的外部符号 "int google::protobuf::internal::empty_string_once_init_" (?empty_string_once_init_@internal@protobuf@google@@3HA)
需要在工程中添加预处理PROTOBUF_USE_DLLS
Protos:
1 syntax = "proto3"; 2 3 message CoinMsg 4 { 5 6 } 7 8 syntax = "proto3"; 9 10 message ExecMsg 11 { 12 string name = 1; 13 } 14 15 syntax = "proto3"; 16 17 message VerifyMsg 18 { 19 bool isOk = 1; 20 string error = 2; 21 } 22 23 syntax = "proto3"; 24 25 import "ExecMsg.proto"; 26 import "CoinMsg.proto"; 27 import "VerifyMsg.proto"; 28 29 message MsgPolicy 30 { 31 enum Type 32 { 33 ExecMsg = 0; 34 CoinMsg = 1; 35 VerifyMsg = 2; 36 } 37 Type type = 1; 38 ExecMsg execMsg = 2; 39 CoinMsg coinMsg = 3; 40 VerifyMsg verifyMsg = 4; 41 }
每个Message对应一个proto文件
// 一次生成完cpp与csharp代码,注protobuf-version-3.1.0 protoc -I ./*.proto --cpp_out=../cpp --csharp_out=../csharp
使用示例:
1 #include "ConfigHelper.h" 2 #include <QFile> 3 #include <QDebug> 4 #include <QDataStream> 5 #include <iostream> 6 #include <fstream> 7 #include <string> 8 #include "MsgPolicy.pb.h" 9 #include <google/protobuf/message_lite.h> 10 #include <google/protobuf/io/coded_stream.h> 11 #include <google/protobuf/io/zero_copy_stream_impl_lite.h> 12 13 ConfigHelper * ConfigHelper::instance = new ConfigHelper(); 14 15 ConfigHelper::ConfigHelper() 16 { 17 #pragma region standard c++ io 18 { 19 // 序列化到文件 20 MsgPolicy msgPolicy; 21 ExecMsg *execMsg = new ExecMsg(); 22 execMsg->set_name("exec message name."); 23 msgPolicy.set_allocated_execmsg(execMsg); 24 msgPolicy.set_type(MsgPolicy::ExecMsg); 25 //QFile file("msg.bin"); 26 //file.open(QIODevice::WriteOnly); 27 std::fstream out("msg.bin", std::ios::out | std::ios::binary | std::ios::trunc); 28 msgPolicy.SerializeToOstream(&out); 29 out.close(); 30 31 // 从文件反序列化到对象 32 MsgPolicy dmsgPolicy; 33 std::fstream in("msg.bin", std::ios::in | std::ios::binary); 34 if (!dmsgPolicy.ParseFromIstream(&in)) 35 { 36 qDebug() << "deserialize data error."; 37 return; 38 } 39 if (dmsgPolicy.type() == MsgPolicy_Type::MsgPolicy_Type_CoinMsg); 40 else if (dmsgPolicy.type() == MsgPolicy_Type::MsgPolicy_Type_ExecMsg) 41 { 42 qDebug() << "policy message type = " << "MsgPolicy_Type::MsgPolicy_Type_ExecMsg"; 43 qDebug() << "execMsg name = " << QString::fromStdString(dmsgPolicy.execmsg().name()); 44 } 45 else if (dmsgPolicy.type() == MsgPolicy_Type::MsgPolicy_Type_VerifyMsg); 46 in.close(); 47 } 48 #pragma endregion standard c++ io 49 50 #pragma region protobuf codedstream 51 { 52 // 序列化 53 MsgPolicy msgPolicy5; 54 VerifyMsg *verifyMsg = new VerifyMsg(); 55 verifyMsg->set_isok(false); 56 verifyMsg->set_error("the password is invalid."); 57 msgPolicy5.set_allocated_verifymsg(verifyMsg); 58 msgPolicy5.set_type(MsgPolicy_Type::MsgPolicy_Type_VerifyMsg); 59 int len = msgPolicy5.ByteSize() + 4; 60 char *buffer = new char[len]; 61 google::protobuf::io::ArrayOutputStream arrayOut(buffer, len); 62 google::protobuf::io::CodedOutputStream codedOut(&arrayOut); 63 codedOut.WriteVarint32(msgPolicy5.ByteSize()); 64 if (!msgPolicy5.SerializeToCodedStream(&codedOut)) 65 { 66 qDebug() << "serialize error."; 67 } 68 delete buffer; 69 70 // 序列化 71 len = msgPolicy5.ByteSize(); 72 buffer = new char[len]; 73 if (!msgPolicy5.SerializeToArray(buffer, len)) qDebug() << "serialize error."; 74 75 // 反序列化 76 MsgPolicy msgPolicy6; 77 msgPolicy6.ParseFromArray(buffer, len); 78 if (msgPolicy6.type() == MsgPolicy_Type::MsgPolicy_Type_CoinMsg); 79 else if (msgPolicy6.type() == MsgPolicy_Type::MsgPolicy_Type_ExecMsg); 80 else if (msgPolicy6.type() == MsgPolicy_Type::MsgPolicy_Type_VerifyMsg) 81 { 82 qDebug() << "policy message type = " << "MsgPolicy_Type::MsgPolicy_Type_VerifyMsg"; 83 qDebug() << "isOk = " << msgPolicy6.verifymsg().isok() << "error = " << QString::fromStdString(msgPolicy6.verifymsg().error()); 84 } 85 delete buffer; 86 } 87 #pragma endregion protobuf codedstream 88 google::protobuf::ShutdownProtobufLibrary(); 89 }
// 输出结果 policy message type = MsgPolicy_Type::MsgPolicy_Type_ExecMsg execMsg name = "exec message name." policy message type = MsgPolicy_Type::MsgPolicy_Type_VerifyMsg isOk = false error = "the password is invalid."
windows下编译google-protocolbuf在Qt中使用
标签:一个 fst get tput 资源下载 hub read 根据 工程
原文地址:https://www.cnblogs.com/linxmouse/p/8975475.html