环境:CentOS7
1、安装
github源代码下载地址:https://github.com/google/protobuf
chmod 777 -R protobuf-3.5.2
cd protobuf-3.5.2
./autogen.sh
./configure
make
make install
ldconfig #refresh shared library cache
执行protoc --version命令可以查看版本
firecats-MacBook-Pro:~ liuquandan$ which protoc
/usr/local/bin/protoc
firecats-MacBook-Pro:~ liuquandan$ protoc --version
libprotoc 3.5.2
通常情况ProtoBuf都安装在/usr/local目录下,该目录下包含了ProtoBuf的头文件,静态库和动态库文件
/usr/local/bin/protoc
/usr/local/include/google/protobuf
/usr/local/lib/libprotobuf.*
protoc:protobuf自带的编译工具,将.proto文件生成指定的类
–cpp_out:指定输出特定的语言和路径
2、写demo测试
helloworld.proto
syntax = "proto3"; package lm; message helloworld { int32 id = 1; // ID string str = 2; // str } person.proto syntax="proto3"; package tutorial; message Person { string name = 1; int32 id = 2; string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { string number = 1; PhoneType type = 2; } repeated PhoneNumber phone = 4; } message AddressBook { repeated Person person =1; } protoc -I=./ --cpp_out=./ helloworld.proto protoc -I=./ --cpp_out=./ person.proto
会自动生成文件:
helloworld.pb.h
helloworld.pb.cc
person.pb.h
person.pb.cc
CMakeLists.txt
cmake_minimum_required(VERSION 2.8) project(pbtest) #set(SRC .) #查找当前目录下的所有源文件,并将名称保存到DIR_SRCS变量 aux_source_directory(. DIR_SRCS) add_executable(${PROJECT_NAME} ${DIR_SRCS}) TARGET_LINK_LIBRARIES(${PROJECT_NAME} protobuf)
main.cpp
#include <iostream> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <string> #include <pthread.h> #include <fstream> #include "helloworld.pb.h" using namespace std; #define BUFFSIZE 1024 int main() { GOOGLE_PROTOBUF_VERIFY_VERSION; //eg1, write file lm::helloworld msg1; msg1.set_id(1001); msg1.set_str("hello world"); fstream output("./log", ios::out | ios::trunc | ios::binary); if (!msg1.SerializeToOstream(&output)) { cerr << "Failed to write msg." << endl; return -1; } output.close(); cout << msg1.id() << endl; cout << msg1.str() << endl; //eg2, read file lm::helloworld msg2; fstream input("./log", ios::in | ios::binary); if (!input) { cerr << "open file failed!\n"; return -1; } if (!msg2.ParseFromIstream(&input)) { cerr << "Parse file failed!" << endl; return -1; } input.close(); cout << msg2.id() << endl; cout << msg2.str() << endl; //eg3, write buf, protobuf序列化 lm::helloworld msg3; msg3.set_id(1002); msg3.set_str("good idea"); char buf[BUFFSIZE]; memset(buf, 0, BUFFSIZE); msg3.SerializeToArray(buf, BUFFSIZE); //eg4, read buf, protobuf反序列化 lm::helloworld msg4; msg4.ParseFromArray(buf, BUFFSIZE); cout << msg4.id() << endl; cout << msg4.str() << endl; // Optional: Delete all global objects allocated by libprotobuf. google::protobuf::ShutdownProtobufLibrary(); return 0; }
编译通过,但是运行时会报错:error while loading shared libraries: libprotobuf.so.15: cannot open shared object file: No such file or directory
此时需要在/etc/ld.so.conf中加入librdkafka.so所在的目录:/usr/local/lib/
然后在终端执行命令,使之生效:
[root@localhost etc]# ldconfig
注意,/usr/local/lib/每次有库文件更新,都需要终端重新运行一次ldconfig这条命令。