Ⅰ 如何編譯protobuf 文件
ProtoBuf java 包編譯ProtoBuf的官方下載包並不包含jar文件,需要用戶自己configure/make….來自行編譯。由於Windows上沒有編譯環境,就用了一個笨一點方法處理了。
分別下載:
protobuf-2.4.1.zip ProtoBuf的源文件(包含了C++/Java/Python)的源文件
protoc-2.4.1-win32.zip 已經編譯過的用於Windows平台的protoc命令(該命令用於將.proto文件轉化為Java或C++源文件)。
分別解析這兩個文件,你可以在protoc-2.4.1-win32.zip解壓後的文件中找到一個protoc.exe文件,將其到protobuf-2.4.1/src目錄下,然後進入protobuf-2.4.1/java,執行:
mvn install
Ⅱ protocol buffer怎樣編譯c++代碼
class LogonReqMessage : public ::google::protobuf::MessageLite {
public:
LogonReqMessage();
virtual ~LogonReqMessage();
// implements Message ----------------------------------------------
//下面的成員函數均實現自MessageLite中的虛函數。
//創建一個新的LogonReqMessage對象,等同於clone。
LogonReqMessage* New() const;
//用另外一裂臘個LogonReqMessage對象初始化當前對象,等同於賦值操作符重載(operator=)
void CopyFrom(const LogonReqMessage& from);
//清空當前對象中的所有數據,既將所有成員變數置為未初始化狀態。
void Clear();
//判斷當前狀態是否已經初始化。
bool IsInitialized() const;
//在給當前對象肆廳滑的所有變數賦值之後,獲取該對象序列化後所需要的位元組數。
int ByteSize() const;
//獲取當前對象的類型名稱。
::std::string GetTypeName() const;
// required int64 acctID = 1;
//下面的成員函數都是因message中定義的acctID欄位而生成伏頌。
//這個靜態成員表示AcctID的標簽值。命名規則是k + FieldName(駝峰規則) + FieldNumber。
static const int kAcctIDFieldNumber = 1;
//如果acctID欄位已經被設置返回true,否則false。
inline bool has_acctid() const;
//執行該函數後has_acctid函數將返回false,而下面的acctid函數則返回acctID的預設值。
inline void clear_acctid();
//返回acctid欄位的當前值,如果沒有設置則返回int64類型的預設值。
inline ::google::protobuf::int64 acctid() const;
//為acctid欄位設置新值,調用該函數後has_acctid函數將返回true。
inline void set_acctid(::google::protobuf::int64 value);
// required string passwd = 2;
//下面的成員函數都是因message中定義的passwd欄位而生成。這里生成的函數和上面acctid
//生成的那組函數基本相似。因此這里只是列出差異部分。
static const int kPasswdFieldNumber = 2;
inline bool has_passwd() const;
inline void clear_passwd();
inline const ::std::string& passwd() const;
inline void set_passwd(const ::std::string& value);
//對於字元串類型欄位設置const char*類型的變數值。
inline void set_passwd(const char* value);
inline void set_passwd(const char* value, size_t size);
//可以通過返回值直接給passwd對象賦值。在調用該函數之後has_passwd將返回true。
inline ::std::string* mutable_passwd();
//釋放當前對象對passwd欄位的所有權,同時返回passwd欄位對象指針。調用此函數之後,passwd欄位對象
//的所有權將移交給調用者。此後再調用has_passwd函數時將返回false。
inline ::std::string* release_passwd();
private:
... ...
};
Ⅲ 在win下怎麼編譯Protobuf
protobuf 是google的一個開源項目,其源代碼在github上可以下載到,並且源碼都採用cmake來構建,所以我們可以把源碼下載到段含盯本地,然後了利用cmake構建本握和地老宴工程,然後編譯.
Ⅳ 在windows環境下 編譯pb (protobuf) 文件
protoc --plugin=protoc-gen-go.exe --go_out= . xx.proto
protoc --plugin=protoc-gen-go.exe --go-grpc_out= . xx.proto
若提示: --go-grpc_out: protoc-gen-go-grpc: 系統找不到指定的文件。
需在 grpc-go-1.31.0\cmd\protoc-gen-go-grpc 進行編譯, go build即可。 把生成的protoc-gen-go-grpc.exe放到你的 GOPATH/bin 目錄下
Ⅳ 使用-fPIC選項編譯出protobuf靜態庫libprotobuf.a
用的64位Ubuntu系統,開發一個共享庫so使用到了protobuf,如果鏈接libprotobuf.so就需要一起打包帶走,否則可能因protobuf版輪頃叢本較多臘櫻出現版本不匹配的問題,所以需要它鏈接靜態庫libprotobuf.a,但是鏈乎攜接時候報錯: relocation R_X86_64_32 against `a local symbol』 can not be used when making a shared object; recompile with -fPIC。
Ⅵ Protocol Buffers(Objective-C)踩坑指南
這篇文章是講如何把protobuf文件的編譯工作集成到Xcode中,達到在Xcode中就像添加一般的OC文件一樣不進行任何多餘的塵沖操作直接編譯運行.proto文件判兄態的目的。
牛逼,這么智能嗎?是的,就是這么智能!
筆者的公司現在所有端都在統一使用一套protobuf數據結構,免除了多端重復定義同一套數據結構的重復工作,效率很高,非常值得推薦。並且Xcode 10進行了一些小優化來增加了對Protobuf的支持,相信不久以後,Xcode對Protobuf的支持將更加智能!
至於什麼是 Protobuf 和 Protobuf 語法教程,不是這篇文章的主題,請自行Google。
環境:Xcode 10+
語言:Objective-C
話不多說,正題開始:
首先,真正的企業級項目,並不只是網上很多教程裡面演示的一兩個 .proto 文件,而是一批 .proto 文件目錄的集合,並且是多端共享的。你會發現按照那些教程裡面的講的去做寫個demo或許可以,但是真正要達到企業級別的使用的時候,還遠遠不夠,你會遇到各種各樣的坑。別問我是怎麼知道的,我都是靠自己一個個踩出來的。
首先,要能編譯Protobuf文件,我們得安裝官方的編譯器。你可以選擇下面任意一種你喜歡的安裝方式:
安裝好後,在terminal中輸入 which protoc 檢測是否安裝成功,如安裝成功會返迴文件路徑: /usr/local/bin/protoc
如有問題,請自行google,不在本教程范圍內。
沒什麼好說的,新建一個Xcode工程。使用Cocoapods引入Protobuf的庫:
Pod search Protobuf
選擇最穩定的版本即可。
這里有兩種創建.proto文件的方式:
至於文件內容,如果你熟悉protobuf語法,那隨便寫幾行即可,如果不熟悉,那麼可以我的測試內容:
A.proto 文件內容:
B.proto 文件內容:
Xcode 自己並不認識 .proto文件,所以並不會自動編譯它們,我們需要把 .proto編譯器 自己集成到項目當中,集成的方式如下:
Project --> Build Rules --> 點擊+號 ,生成一個特定文件類型編譯腳本。
比如:
到此處,我們有幾個注意事項:
我們試試把 --proto_path 換成相對路徑,看會發生什麼,也就是把腳本換成
編譯運行,咦~報錯了。查看日誌,我們可以看到這么一條log信息:
翻譯過來就是在--proto_path這個參數中你必須指定.proto源文件的精確路徑, protoc 太笨了,它無法搞清楚這個相對路徑是不是我們要的絕對路徑。google的工程師說這太他么難了。所以這里很明確了, --proto_path 的參數值,只能是proto文件根目錄的絕對路徑。
我們上面說了,${INPUT_FILE_PATH} 是代表編譯輸入源文件的絕對路徑。
文檔裡面給的demo是:
protoc --proto_path=src --objc_out=build/gen src/foo.proto src/bar/baz.proto
什麼意思呢?
它說,最終掘源編譯器會把 src/foo.proto 文件編譯成: build/gen/Foo.pbobjc.h 和 build/gen/Foo.pbobjc.m 文件。
而會把 src/bar/baz.proto 文件編譯成 build/gen/bar/Baz.pbobjc.h 和 build/gen/bar/Baz.pbobjc.m 。
而不是 build/gen/Baz.pbobjc.h 和 build/gen/Baz.pbobjc.m
也就是說protobuf編譯器最終生成的文件會自動按照文件源目錄結構存放。
特別強調 並不會 自動創建 build/gen 目錄,這個目錄需要你提前建好。
並且,查看最終編譯生成的.m文件,你會發現一些有趣的事情;比如我在A.proto中引入了B.proto文件,你會看到Protobuf最終編譯出來的A.pbobjc.m文件導入文件的格式是包含文件路徑的,例如:
我們注意到,上面設置的proto文件的編譯輸出路徑是 $DERIVED_FILE_DIR , 這是為何呢?
答案是為了方便Xcode的集成。
對於自定義的編譯腳本,都需要設置一個文件的輸出路徑.
我們點腳本框下面的Output Files下面的 + 號, 指定文件輸出路徑。
因為OC文件分為.h和.m文件,所以我們指定2個。
點了之後,你會發現,xcode默認給出的是 $(DERIVED_FILE_DIR)/newOutputFile ,
我們將其改為 $(DERIVED_FILE_DIR)/${INPUT_FILE_BASE}.pbobjc.h 和 $(DERIVED_FILE_DIR)/${INPUT_FILE_BASE}.pbobjc.m ,並且在.m文件的 Compiler Flags 中指定為 -fno-objc-arc 代表該.m文件採用mrc編譯。
編譯運行,大功告成,是不可能的!!!!
你會發現又報錯了:
什麼意思呢? 其實就是在 DerivedSources 下找不到 A.pbobjc.m 文件。因為我們指定這個編譯的輸出路徑在這個目錄下,所以Xcode在進行OC文件的編譯時會去這個目錄下找,但是它找不到。為什麼找不到呢?我們去這個目錄下看,這個目錄下確實沒有 A.pbobjc.m 這個文件,但是確發現有 a/A.pbobjc.m 。原因我們已經說了,protoc最終的編譯文件會自動加上目錄前綴。
有人可能會說,能不能把輸出文件改成 $(DERIVED_FILE_DIR)/*/${INPUT_FILE_BASE}.pbobjc.h 呢?那我們就來試下。
編譯運行
what the hell?
原來,Xcode的Output Files特別蠢,它不支持類似這種通配符寫法: $(DERIVED_FILE_DIR)/*/${INPUT_FILE_BASE}.pbobjc.h 。
也不支持傳入任何的自定義變數。
只能是明確的文件路徑和Xcode自帶的環境變數,但是實際項目中,可能不只一層路徑,有可能是文件夾下嵌套文件夾。
靠,那這怎麼辦呢?
實在沒辦法了,就在打算放棄的時候,咨詢了我們的腳本大神,我們嘗試了以下在腳本末尾再加了兩行:
是不是很機智?
什麼意思呢?就是說我們cd到該目錄,然後找到該文件對應生成的oc文件,將其一份兒到根目錄。懷著求神拜佛的意志,運行了以下,Perfect,終於不再報錯了,到目錄中查看,也正是我們想要的,所有文件都被出來了。
下一步,就是正常的在項目中import和使用了。
你以為到此就沒有坑了嗎?到此還有坑。有2點需要注意:
好了,就講到這里吧,如果覺得文章看得不是很明白,需要一個demo。或者大神有更好的建議,請在評論區留言~
如果文章對你有幫助,請不要吝嗇你的點贊哦,你的支持是我分享的動力~
如果大家喜歡,有時間再講講怎麼改改AFNetworking,能直接請求後端給的 Protobuf 格式的數據~
Ⅶ 如何在windows下VC++使用protobuf
當前版本為2.3.0,下載兩個御裂此壓縮包:protoc-2.3.0-win32.zip和protobuf-2.3.0.zip,前者是protobuf的編譯器,後者包含了有三程序語言的開發包。
2.解壓
首先解壓protoc-2.3.0-win32.zip,把protoc.exe文件放到path路徑中,最簡單的做法就是把這個文件拷貝到C:/WINDOWS目錄下。
解壓protobuf-2.3.0.zip文件,將文件加壓到C盤根目錄,主文件位於C:/protobuf-2.3.0/protobuf-2.3.0目錄下。
3.安裝操作
(1)使用VS2005編譯proto,源悔VS工程目錄位於vsprojects目錄中,工程名字為「protobuf.sln」。
(2)選擇「生成」à「生成解決方案」選項進行編譯,編譯過程中可能會由於編譯的順序報錯誤,可以使用手工逐個順序編譯生成,可能會比較順利。按照下圖的順序,右鍵「重新生成」,逐個編譯。但是我在實習操作過程中,libprotobuf-lite工程重來都沒鎮迅有成功編譯通過過。淡定先,這個不會影響大局的。
Ⅷ OpenCV靜態庫編譯與鏈接
以OpenCV-4.0.0為例說明在Ubuntu環境下的靜態庫編譯與鏈接方法:
opencv依賴第三方的庫,所以當把opencv編譯成靜態庫的時候,注意要把它運行時必要的依賴庫也編譯進來,opencv源碼內有自己的3rdparty,主要有:libjpeg、libpng、libtiff、libzlib、libwebp、libprotobuf、ffmpeg(用到video時編譯)、libgtk(用於顯示界面顯示,伺服器部署不會用到),可以通過cmake -LA來查看配置的編譯信息,再根據信息考慮把opencv的哪些mole編譯進來。
鏈接時指定opencv的靜態庫以及依賴的庫。另外需要注意頭文件的問題,通過CMakeLists把opencv加入項目編譯時,由於opencv編譯完成後要install才會把所用的頭文件集中拷貝到一個地方,所以事先將頭文件拷貝到了項目的opencv目錄下。
Ⅸ protobuf c++代碼怎麼編譯
步驟一:部署protoc.exe 1)sudo su ---進入管理模式 //以下操作切換至protobuf文件夾下 2)./configure 3)make 4)make check 5)make install 此時可以查看protobuf文件夾下面的makefile文件,可以查看-build表示的本機環境以及-host表示的編譯...
Ⅹ java序列化Protostuff和Serializable的區別
序列化就是將Java Object轉成byte[];反序列化就是將byte[]轉成Java Object。
Java自帶序列化機制java.io.Serializable
標識一個對象需要系列化,該對象類型需要實現 Serializable 介面。
1,序列化的類型和反序列化的類型的序列化ID必須一致(遠程信息交換時)。
2,靜態數據不會被序列化,Transient關鍵字修飾的欄位不會被序列化。
3,對象序列化存儲時,兩次存儲相同值對象會有優化(第二次對象寫入會只存儲引用)。
Protostuff是一個序列化庫,支持一下序列化格式:
protobuf
protostuff (native)
graph (protostuff with support for cyclic references. See Serializing Object Graphs)
json
smile (binary json useable from the protostuff-json mole)
xml
yaml (serialization only)
kvp (binary uwsgi header)
序列化
@SuppressWarnings("unchecked")
public static <T> byte[] serialize(T obj) {
Class<T> cls = (Class<T>) obj.getClass();//獲得對象的類;
LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);//使用LinkedBuffer分配一塊默認大小的buffer空間;
try {
Schema<T> schema = getSchema(cls);//通過對象的類構建對應的schema;
return ProtostuffIOUtil.toByteArray(obj, schema, buffer);//使用給定的schema將對象序列化為一個byte數組,並返回。
} catch (Exception e) {
throw new IllegalStateException(e.getMessage(), e);
} finally {
buffer.clear();
}
}
反序列化
public static <T> T deserialize(byte[] data, Class<T> cls) {
try {
T message = objenesis.newInstance(cls);//使用objenesis實例化一個類的對象;
Schema<T> schema = getSchema(cls);//通過對象的類構建對應的schema;
ProtostuffIOUtil.mergeFrom(data, message, schema);//使用給定的schema將byte數組和對象合並,並返回。
return message;
} catch (Exception e) {
throw new IllegalStateException(e.getMessage(), e);
}
}
優缺點比較:
優點 缺點
Serializable 使用方便,可序列化所有類 速度慢,占空間
Protostuff 速度快,基於protobuf 需靜態編譯