導航:首頁 > 源碼編譯 > protobuf如何靜態編譯

protobuf如何靜態編譯

發布時間:2023-03-27 03:00:41

Ⅰ 如何編譯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 需靜態編譯

閱讀全文

與protobuf如何靜態編譯相關的資料

熱點內容
凈化車間門演算法 瀏覽:934
安卓怎麼搞jpg 瀏覽:544
如來佛祖命令雷神去下界 瀏覽:854
新電腦管家下載好怎麼解壓 瀏覽:528
php獲取介面數據 瀏覽:763
最後的命令 瀏覽:921
如何添加手機app桌面快捷圖標 瀏覽:427
ui設計師與程序員 瀏覽:417
壽司pdf 瀏覽:828
pythonbg是什麼 瀏覽:248
c數值演算法程序大全 瀏覽:785
android整點報時 瀏覽:221
稀土pdf 瀏覽:536
單片機電子鎖 瀏覽:596
通達信機智資金流指標公式源碼 瀏覽:216
php安裝xsl擴展 瀏覽:842
python如何使用help 瀏覽:367
上汽榮威app在哪裡查詢 瀏覽:903
冰櫃壓縮機溫度108 瀏覽:720
阿里雲郵smtp伺服器地址 瀏覽:253