解决proto3的"Timestamp" is not defined问题

因为protobuf3新增了Timestamp类型,所以想试一下,但结果出现如下错误,搜了一下google,结果没多少个有答案的,只好自己解决;

解决proto3的

找到message Timestamp的定义是在\protobuf-3.0.0-beta-1\src\google\protobuf下的timestamp.proto文件里,直接将此文件复制到我使用它的那个DataAccessSerivceMassages.proto文件的同一目录,然后当然不行的,之后实在不能,就直接将timestamp.proto文件的Timestamp类型的定义直接复制进DataAccessSerivceMassages.proto文件里,结果居然可以;那么让这个定义再放在一个新的文件里然后import此文件呢,结果也是可以;然后对比一下新建的此文件和原本的timestamp.proto文件,发现,新的文件没有package google.protobuf;这一行定义,然后终于明白,原来是作用域的问题;
解决的方法为:
1.在用proto文件生成代码的bat语句中加入Timestamp.proto的路径,我的是在源码中D:\WorkCode\protobuf-3.0.0-beta-1\src\google\protobuf的位置,因为在import是有加上google/protobuf的目录位置,所以只导入D:\WorkCode\protobuf-3.0.0-beta-1\src目录就可以了;你可能会奇怪,为什么可以使用两个"-I"参数,是的,在https://developers.google.com/protocol-buffers/docs/proto中的

The Protocol Compiler is invoked as follows:

protoc –proto_path=IMPORT_PATH –cpp_out=DST_DIR –java_out=DST_DIR –python_out=DST_DIR path/to/file.proto
IMPORT_PATH specifies a directory in which to look for .proto files when resolving importdirectives. If omitted, the current directory is used. Multiple import directories can be specified by passing the –proto_path option multiple times; they will be searched in order. -I=IMPORT_PATH can be used as a short form of –proto_path.

请翻翻观看…

人家就说明,如果要导入多个目录,可以使用多次”–proto_path=”来导入多个目录,当然”-I=”与”–proto_path=”是等价的。

%PROTOBUF_HOME%\Release\protoc -I=. -I=D:/WorkCode/protobuf-3.0.0-beta-1/src –grpc_out=./generate –plugin=protoc-gen-grpc=%GRPC_HOME_RELEASE%\grpc_cpp_plugin.exe ./DataAccessSerivceInterface.proto

%PROTOBUF_HOME%\Release\protoc -I=. -I=D:/WorkCode/protobuf-3.0.0-beta-1/src –cpp_out=./generate ./DataAccessSerivceInterface.proto

(注:之后才发现,不需要添加这个目录也可以,因为timestamp.proto生成的timestamp.pb.cc文件已经在编译libprotobuf.lib文件时作为源码编译进去了,而编译protoc.exe里也用到了libprotobuf.lib,所以自然默认已经有源码了,所以不用再导入!)

2.打开你的.proto文件,在里面添加,记得别忘了";" 分号,不然会出错;

import public “google/protobuf/timestamp.proto”;
**(注意:timestamp.proto的t必定是小写的,不然如果写错成大写会有如下问题:
Error 2 error C3861: ‘protobuf_AddDesc_google_2fprotobuf_2fTimestamp_2eproto’: identifier not found f:\workspace\qt\pamxysql\sql\dataaccessservice\src\proto\generate\dataaccessserivcemassages.pb.cc 2033
Error 1 error C2039: ‘protobuf_AddDesc_google_2fprotobuf_2fTimestamp_2eproto’ : is not a member of ‘google::protobuf’ f:\workspace\qt\pamxysql\sql\dataaccessservice\src\proto\generate\dataaccessserivcemassages.pb.cc 2033
)**)

3.在你需要用到Timestamp类型的message里使用google.protobuf.Timestamp而不是Timestamp,往往我们导入了正确的目录但仍提示说Timestamp未定义就是因为此定义,因为作用域不同,一般我们会定义自己的package,而Timestamp的package是google.protobuf,两个作用域不一样,导致你定义的类型找不到Timestamp,而现在我们直接指名是在google.protobuf里的Timestamp,所以终于能够编译成功了!

message ReqAddFriend
{
uint64 personID=1;
uint64 friendID=2;
google.protobuf.Timestamp addDateTime=3;
string comment=4;
}

解决proto3的

你可能感兴趣的:(Protobuf,c++)