安装编译

按照Readme来就行,我安装在了默认的/usr/local路径,所以需要在环境变量中加入路径。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/lib

export PATH=$PATH:/usr/local/bin

查看版本

protoc --version

proto文件写法

文件名为Mymessage.proto

syntax = "proto3";
package Im;
message Content{
    int32   id = 1;
    string  name = 2;
    int32   passwd = 12;
}

编译成C++文件

protoc ./Mymessage.proto --cpp_out=/home/ywq/test-probuf
生成Mymessage.pb.ccMymessage.pb.h两个文件

报错Missing input file.

原因:如果proto描述文件在当前目录,要以"./"开始。

解析与序列化

//序列化消息,将存储字节的以string方式输出。注意字节是二进制,而非文本;
bool SerializeToString(string* output); 
bool ParseFromString(const string& data);  //解析给定的string     
bool SerializeToOstream(ostream* output);  //写消息给定的c++  ostream中
bool ParseFromIstream(istream* input);  //从给定的c++ istream中解析出消息

makefile文件写法

坑很多,如果没有加-std=c++11会编译失败;没有-lpthread编译可以成功,但是运行时会失败。

INC=/usr/local/lib
LIB=/usr/local/lib
lib=protobuf
all:Writer Reader

Writer.o: Writer.cpp
    g++ -std=c++11 -g -c Writer.cpp -lpthread -I$(INC) -L$(LIB) -l$(lib) 

Reader.o: Reader.cpp
    g++ -std=c++11 -g -c Reader.cpp -lpthread -I$(INC) -L$(LIB) -l$(lib) 

Writer: Writer.o Mymessage.pb.o
    g++ -std=c++11 -g -o Writer Writer.o Mymessage.pb.o -lpthread -I$(INC) -L$(LIB) -l$(lib)

Reader: Reader.o Mymessage.pb.o
    g++ -std=c++11 -g -o Reader Reader.o Mymessage.pb.o -lpthread -I$(INC) -L$(LIB) -l$(lib) 

Mymessage.pb.o: Mymessage.pb.cc
    g++ -std=c++11 -g -c Mymessage.pb.cc -lpthread -I$(INC) -L$(LIB) -l$(lib) 

clean: Writer Reader Reader.o Writer.o Mymessage.pb.o
    rm Writer Reader Reader.o Writer.o Mymessage.pb.o