linux下安装protobuf教程+示例(详细)

(.pb.h:9:42: fatal error: google/protobuf/stubs/common.h: No such file or directory

看这个就应该知道是没有找到头文件,那么可以使用g++ 的-I 参数:
-I/usr/local/lib/protobuf/include来命令g++在/usr/local/lib/protobuf下查找头文件
以上/usr/local/lib/protobuf/是我的protobuf的安装地址,请替换成你的

)
 
 
1 在网站 http://code.google.com/p/protobuf/downloads/list上可以下载 Protobuf 的源代码。然后解压编译安装便可以使用它了。
安装步骤如下所示:
 tar -xzf protobuf-2.1.0.tar.gz 
 cd protobuf-2.1.0 
 ./configure --prefix=/usr/local/protobuf
 make 
 make check 
 make install 
 
 2 > sudo vim /etc/profile
 添加
export PATH=$PATH:/usr/local/protobuf/bin/
export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/
保存执行
source /etc/profile

同时 在~/.profile中添加上面两行代码,否则会出现登录用户找不到protoc命令

3 > 配置动态链接库路径
sudo vim /etc/ld.so.conf
插入:
/usr/local/protobuf/lib

4 > su  #root 权限
ldconfig

5> 写消息文件:msg.proto

  1. package lm;   
  2. message helloworld   
  3. {   
  4.     required int32     id = 1;  // ID     
  5.     required string    str = 2;  // str    
  6.     optional int32     opt = 3;  //optional field   
  7. }  
将消息文件msg.proto映射成cpp文件
protoc -I=. --cpp_out=. msg.proto
可以看到生成了
msg.pb.h 和msg.pb.cc

6> 写序列化消息的进程
write.cc
  1. #include "msg.pb.h"  
  2. #include <fstream>  
  3. #include <iostream>  
  4. using namespace std;  
  5.   
  6. int main(void)   
  7. {   
  8.   
  9.     lm::helloworld msg1;   
  10.     msg1.set_id(101);   
  11.     msg1.set_str("hello");   
  12.     fstream output("./log", ios::out | ios::trunc | ios::binary);   
  13.   
  14.     if (!msg1.SerializeToOstream(&output)) {   
  15.         cerr << "Failed to write msg." << endl;   
  16.         return -1;   
  17.     }          
  18.     return 0;   
  19. }  
编译 write.cc 
 g++  msg.pb.cc write.cc -o write  `pkg-config --cflags --libs protobuf` -lpthread
 
执行write 
./write, 可以看到生成了log文件

7> 写反序列化的进程
reader.cc
  1. #include "msg.pb.h"  
  2. #include <fstream>  
  3. #include <iostream>  
  4. using namespace std;  
  5.   
  6. void ListMsg(const lm::helloworld & msg) {    
  7.     cout << msg.id() << endl;   
  8.     cout << msg.str() << endl;   
  9. }   
  10.   
  11. int main(int argc, char* argv[]) {   
  12.   
  13.     lm::helloworld msg1;   
  14.   
  15.     {   
  16.         fstream input("./log", ios::in | ios::binary);   
  17.         if (!msg1.ParseFromIstream(&input)) {   
  18.             cerr << "Failed to parse address book." << endl;   
  19.             return -1;   
  20.         }         
  21.     }   
  22.   
  23.     ListMsg(msg1);   
  24. }  
编译:g++  msg.pb.cc reader.cc -o reader  `pkg-config --cflags --libs protobuf` -lpthread
执行./reader 输出 :
101
hello

8> 写Makefile文件

    1. all: write reader  
    2.   
    3. clean:  
    4.     rm -f write reader msg.*.cc msg.*.h *.o  log  
    5.   
    6. proto_msg:  
    7.     protoc --cpp_out=. msg.proto  
    8.   
    9.   
    10. write: msg.pb.cc write.cc  
    11.     g++  msg.pb.cc write.cc -o write  `pkg-config --cflags --libs protobuf`  
    12.   
    13. reader: msg.pb.cc reader.cc  
    14.     g++  msg.pb.cc reader.cc -o reader  `pkg-config --cflags --libs protobuf` 
原文地址:https://www.cnblogs.com/oracleloyal/p/5485432.html