• 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` 
  • 相关阅读:
    洛谷 2846 (线段树)
    Conclusion
    codevs 2495 水叮当的舞步IDA*
    1247 排排站 USACO(查分+hash)
    洛谷 1373 小a和uim之大逃离
    noip 2012 疫情控制
    poj 1780 code(欧拉路)
    uva 1391 Astronauts(2-SAT)
    uva 1146 Now or late (暴力2-SAT)
    uva 11324 The Largest Clique (Tarjan+记忆化)
  • 原文地址:https://www.cnblogs.com/oracleloyal/p/5485432.html
Copyright © 2020-2023  润新知