brook@vista:~/protobuf$ git clone git://github.com/google/protobuf.git Cloning into 'protobuf'... ... brook@vista:~/protobuf/protobuf$ git checkout 3.6.x Branch 3.6.x set up to track remote branch 3.6.x from origin. ... brook@vista:~/protobuf/protobuf$ . /opt/oecore-x86_64/environment-setup-cortexa7-neon-vfpv4-oe-linux-gnueabi brook@vista:~/protobuf/protobuf$ vim configure.ac export CFLAGS export CXXFLAGS ### remove below line ### AC_CONFIG_SUBDIRS([third_party/googletest]) brook@vista:~/home6t/protobuf/protobuf$ ./autogen.sh + mkdir -p third_party/googletest/m4 + autoreconf -f -i -Wall,no-obsolete ... brook@vista:~/protobuf/protobuf$ ./configure ${CONFIGURE_FLAGS} --prefix=/home/brook/protobuf/ configure: loading site script /opt/oecore-x86_64/site-config-cortexa7-neon-vfpv4-oe-linux-gnueabi checking whether to enable maintainer-specific portions of Makefiles... yes checking build system type... x86_64-pc-linux-gnu ... brook@vista:~/protobuf/protobuf$ make all -j 8 make all-recursive Making install in . make[1]: Entering directory '/home/brook/protobuf/protobuf' ... brook@vista:~/protobuf/protobuf$ make install Making install in . make[1]: Entering directory '/home/brook/protobuf/protobuf' ... change "/home/brook/protobuf/lib/libprotoc.la" from # Libraries that this one depends upon. dependency_libs=' =/home6t/brook/protobuf/lib/libprotobuf.la =/usr/lib/libstdc++.la' to # Libraries that this one depends upon. dependency_libs='' brook@vista:~$ mkdir protobuf-c brook@vista:~$ cd protobuf-c brook@vista:~/protobuf-c$ git clone git://github.com/protobuf-c/protobuf-c.git Cloning into 'protobuf-c'... remote: Enumerating objects: 59, done. remote: Counting objects: 100% (59/59), done. ... brook@vista:~/protobuf-c/protobuf-c$ ./autogen.sh autoreconf: Entering directory `.' autoreconf: configure.ac: not using Gettext ... brook@vista:~/protobuf-c/protobuf-c$ PROTOC=/usr/bin/protoc-c protobuf_CFLAGS="-I/home/brook/protobuf/include" protobuf_LIBS="-L/home/brook/protobuf/lib" ./configure ${CONFIGURE_FLAGS} --prefix=/home/brook/protobuf-c configure: loading site script /opt/oecore-x86_64/site-config-cortexa7-neon-vfpv4-oe-linux-gnueabi checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes ... brook@vista:~/protobuf-c/protobuf-c$ make -j 8 make all-am make[1]: Entering directory '/home/brook/protobuf-c/protobuf-c' CC protobuf-c/protobuf-c.lo ...
2019年7月7日 星期日
Using openembedded SDK to build protobuf-c
2019年6月1日 星期六
Protocol Buffers - for C++
Protocol buffers基本上我把他想成是一個資料庫應用的延伸, 這話該如何說呢? 基本上他就是透過名為proto的meta file, 用以描述資料形態與內容(做encode/decode).
How does the Protocol Buffers work?
先定義你的message結構, 如message Person { required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4; }
再用protoc將該檔案轉成code, 目前支援(C++, Java and Python), 如下例子, 將brook.proto轉成C++(brook.pb.cc與brook.pb.h).
brook@vista:~/protobuf/CPP$ protoc --cpp_out=. brook.proto brook@vista:~/protobuf/CPP$ ls brook.pb.cc brook.pb.h brook.proto
這些code會包含存取每一個欄位的API(如下由doxygen產生的圖), 如email()與set_email(), 用以serialize/parse資料,
接著我們就可以用這些API寫一段code, 做serialize/parse資料
#include <iostream> #include <fstream> #include "brook.pb.h" using namespace std; static void _Serialize(void) { Person person; person.set_name("John Doe"); person.set_id(1234); person.set_email("jdoe@example.com"); fstream output("myfile", ios::out | ios::binary); person.SerializeToOstream(&output); } static void _Parse(void) { Person person; fstream input("myfile", ios::in | ios::binary); person.ParseFromIstream(&input); cout << "Name: " << person.name() << endl; cout << "E-mail: " << person.email() << endl; } int main(int argc, char *argv[]) { _Serialize(); _Parse(); return 0; } brook@vista:~/protobuf/CPP$ g++ main.c brook.pb.cc -lprotobuf brook@vista:~/protobuf/CPP$ ./a.out Name: John Doe E-mail: jdoe@example.com
- 參考資料:
- protocol buffer簡介, https://developers.google.com/protocol-buffers/docs/overview
訂閱:
文章 (Atom)
熱門文章
-
轉自 http://www.wretch.cc/blog/redsonoma/14021073 基本概念: 1> tty(終端設備的統稱): tty一詞源於Teletypes,或者teletypewriters,原來指的是電傳打字機,是通過串行線用打印機鍵盤通過閱...
-
Work queue提供一個interface,讓使用者輕易的建立kernel thread並且將work綁在這個kernel thread上面,如下圖[1]所示。 由於work queue是建立一個kernel thread來執行,所以是在process context...
-
(V)將介紹file operations中的ioctl。ioctl的prototype為: int (*ioctl) (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg); ...
-
這兩天電腦的word忽然都不能存檔,即便是另存新檔也不行,最後都只能放棄修改檔案,即便重新安裝過或者更新成2007也都不能存檔,最後就乖乖的google一下,原來是暫存的資料夾不存在,按照以下方式就可以解決了。 資料來源: word 2003不能存檔問題 編輯機碼的(reg...
-
System Call在HW和user space提供一層抽象層,主要目的有: 為user space提供硬體抽象層。比如,讀取檔案時,不用管檔案所在的媒體類型與檔案儲存類型。 System call能確保系統的安全與穩定。避免user space的無意或惡意的破壞。 ...
-
在kernel中建立thread可以使用kthread_create(),建立一個task,然後在調用wake_up_process(task)讓task真正的運行,如果要kill一個kthread可以使用kthread_stop()。 在kernel中,將kthread_cr...
-
Linux module練習手札I紀錄如何撰寫一個簡單的module,並且編輯它,以及load和unload一個module。 write a module #include <linux/init.h> #include <linux/module.h...
-
幾乎任何使用 TCP,UDP或UNIX-domain socket的動作都可以用nc來達成,常見的功能如。 simple TCP proxies shell-script based HTTP clients and servers network daemon testi...
-
很多人心中都有過一個問題 What is the difference between Platform driver and normal device driver? ,簡單的來說Platform devices就non-discoverable,也就是device本身沒辦法...
-
組成元件 要能正確顯示資料,必須包含資料倉儲(Store),資料欄位的定義(ColumnModel)。 首先我們先定義資料欄位: var cm = new Ext.grid.ColumnModel({ {header: 'Name', dataIndex...