安装编译
按照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.cc
和Mymessage.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