解決proto3的"Timestamp" is not defined問題
因為protobuf3新增了Timestamp型別,所以想試一下,但結果出現如下錯誤,搜了一下google,結果沒多少個有答案的,只好自己解決;
找到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;
}
相關文章
- Python 解決 :NameError: name 'reload' is not defined 問題PythonError
- 解決使用者認證腳手架命令 no commands defined in the "ui" namespace 的問題UInamespace
- 解決「問題」,不要解決問題
- 怎樣解決 [Vue warn]: The computed property "count" is already defined in data. 報錯問題?Vue
- 解決Struts2 json-plugin Date或Timestamp等日期格式帶T的問題JSONPlugin
- Toad 與 timestamp 型別的問題?型別
- 解決問題
- 發現問題,解決問題
- 【問題解決】單機搭建dataguard的問題
- 黑蘋果的問題解決蘋果
- 遇到問題的解決方法
- display:flex解決的問題Flex
- 解決bigdecime的問題
- oracle 鎖問題的解決Oracle
- vpd碰到的問題解決
- 驢解決不了的問題
- 解決 Unexpectedlexicaldeclarationincaseblock的問題BloC
- MYSQL timestamp NOT NULL插入NULL的報錯問題MySqlNull
- 解決github訪問慢的問題Github
- 解決 github 訪問不了的問題Github
- 已解決:Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986 問題
- yum問題解決
- sqlitedabaseislocked問題解決SQLite
- dump 解決問題
- 解決Redmine建立&更新問題時很慢的問題
- 解決問題的方法和途徑-問題管理
- ConfigureGC.pl,version SUNWprivate_1.1 not defined in file libjvm.so with link time reference問題解決GCJVM
- 解決JS跨域訪問的問題JS跨域
- 提升解決問題能力的思考
- JAR衝突問題的解決JAR
- 01揹包問題的解決
- 解決localdb中文智慧的問題
- 今天解決的兩個問題
- **PHPNotice:Undefinedindex:…問題的解決方法PHPUndefinedIndex
- 【轉】css解決相容的問題CSS
- oracle壞塊問題的解決Oracle
- 暫時解決的中文問題
- 提問題比解決問題更重要