CmakeLists.txt protobuf编译

原创 2016年08月31日 11:17:22
平台:ubuntu 14.04 X64

简介

protobuf可以用于描述据结构,可以用于序列化和反序列化,并且适用于多平台的扩展,是比较好的数据描述平台。

操作

在某一文件夹下,按照以下顺序操作

mkdir test
gedit AddressBook.proto
gedit main.cpp
gedit CMakeLists.txt

其中,main.cpp

#include <iostream>
#include <fstream>
#include <vector>
#include "AddressBook.pb.h"

using namespace std;

// This function fills in a Person message based on user input.
void PromptForAddress(tutorial::Person* person) 
{
    cout << "Enter person ID number: ";
    int id;
    cin >> id;
    person->set_id(id);
    cin.ignore(256, '\n');

    cout << "Enter name: ";
    getline(cin, *person->mutable_name());

    cout << "Enter email address (blank for none): ";
    string email;
    getline(cin, email);
    if (!email.empty()) 
    {
        person->set_email(email);
    }

    while (true) 
    {
        cout << "Enter a phone number (or leave blank to finish): ";
        string number;
        getline(cin, number);
        if (number.empty()) 
        {
            break;
        }

        tutorial::Person::PhoneNumber* phone_number = person->add_phone();
        phone_number->set_number(number);

        cout << "Is this a mobile, home, or work phone? ";
        string type;
        getline(cin, type);
        if (type == "mobile") 
        {
            phone_number->set_type(tutorial::Person::MOBILE);
        } 
        else if (type == "home") 
        {
            phone_number->set_type(tutorial::Person::HOME);
        }
         else if (type == "work") 
         {
            phone_number->set_type(tutorial::Person::WORK);
        }
        else 
        {
            cout << "Unknown phone type.  Using default." << endl;
        }
    }
}


int main(int argc, char *argv[])
{
    GOOGLE_PROTOBUF_VERIFY_VERSION;

    if (argc != 2) 
    {
        cerr << "Usage:  " << argv[0] << " ADDRESS_BOOK_FILE" << endl;
        return -1;
    }

    tutorial::AddressBook address_book;

    {
    // Read the existing address book.
    fstream input(argv[1], ios::in | ios::binary);
    if (!input) {
      cout << argv[1] << ": File not found.  Creating a new file." << endl;
    } else if (!address_book.ParseFromIstream(&input)) {
      cerr << "Failed to parse address book." << endl;
      return -1;
    }
    }

    // Add an address.
    PromptForAddress(address_book.add_person());

    {
    // Write the new address book back to disk.
    fstream output(argv[1], ios::out | ios::trunc | ios::binary);
    if (!address_book.SerializeToOstream(&output)) {
      cerr << "Failed to write address book." << endl;
      return -1;
    }
    }

    // Optional:  Delete all global objects allocated by libprotobuf.
    google::protobuf::ShutdownProtobufLibrary();

    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
PROJECT (cppTest)
SET(SRC_LIST main.cpp)

# Find required protobuf package
find_package(Protobuf REQUIRED)
if(PROTOBUF_FOUND)
    message(STATUS "protobuf library found")
else()
    message(FATAL_ERROR "protobuf library is needed but cant be found")
endif()

include_directories(${PROTOBUF_INCLUDE_DIRS})
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
PROTOBUF_GENERATE_CPP(PROTO_SRCS PROTO_HDRS AddressBook.proto)

ADD_EXECUTABLE(cppTest ${SRC_LIST} ${PROTO_SRCS} ${PROTO_HDRS})

 target_link_libraries(cppTest ${PROTOBUF_LIBRARIES})

AddressBook.proto

package tutorial;

message Person {
    required string name=1;
    required int32 id=2;
    optional string email=3;

    enum PhoneType {
        MOBILE=0;
        HOME=1;
        WORK=2;
    }

    message PhoneNumber {
        required string number=1;
        optional PhoneType type=2 [default=HOME];
    }

    repeated PhoneNumber phone=4;
}

message AddressBook {
    repeated Person person=1;
}

运行如下

cmake ./ && make
./cppTest test.txt

按照提示操作,即可创建Person类型的数据,并存储在test.txt文件中

解释

关于protobuf在CMakeLists.txt中怎么编译得出pb.h好热pb.cc文件:
* find_package
* INCLUDE_DIRECTORIES
* PROTOBUF_GENERATE_CPP
* 生成pb.hpb.cc必须要加的指令
* ADD_EXECUTABLE
* 必须要将生成的pb.hpb.cc文件加入到其中,否则编译通不过
* target_link_libraries

版权声明:本文为博主原创文章,未经博主允许不得转载。

使用cmake编译protobuf生成vs2010工程

1、官网下载cmake,并安装,提示选择添加环境变量,选择添加。 2、下载 protocolbuffer, https://github.com/google/protobuf/releases, 并...
  • whymm
  • whymm
  • 2016年06月08日 11:15
  • 1763

Win7 vs2015编译protobuf-3.0.0

需要工具: 1. visual studio 2015  2. cmake 3.git[可选] 安装完毕,继续 从官网下载protobuf :https://github.com/goog...
  • Jammg
  • Jammg
  • 2016年09月20日 17:41
  • 4309

linux下protobuf 下载并cmake编译安装全过程脚本

github上下载最新版本的protobuf源码zip包,并解压缩到本地 fetch_protobuf.sh#!/bin/bashshell_folder=$(cd "$(dirname "$0")...
  • 10km
  • 10km
  • 2017年06月05日 12:16
  • 1134

protobuf vs2015编译

protobuf vs2015编译

Protobuf编译及学习

protobuf源码C++版本 可以从protobuf-3.10下载, 解压进入cmake目录然后使用cmake生成项目解决方案编译。 examples目录包含一些例子,可以学习。 要使用Protob...

ubuntu 14.04 安装 cmake 3.3 和 protobuf 2.6.1

1. cmake 下载网址:https://cmake.org/download/ 2. protbuf 下载网址:https://github.com/smartsharp/protobuf/...
  • zhbpd
  • zhbpd
  • 2016年01月13日 18:34
  • 861

【OpenCV】使用cmake生成MakeFile时下载文件

在编译OpenCV以及其附加模块时,有时会需要一些第三方的库,如果本地没有,会自动下载,下载地址一般为GitHub,结果当然就是卡死在那里,根本无法下载,下面教大家如何解决这种问题。 问题重现比如我在...
  • wr132
  • wr132
  • 2017年02月24日 01:56
  • 1989

Ubuntu下安装gem包curses的步骤

curses是一个原生gem包,所以需要先安装curses库:sudo apt-get install libncurses5-dev然后再安装gem包即可:gem install curses以下是...
  • mydo
  • mydo
  • 2017年03月22日 19:00
  • 724

Docker学习笔记 — Dockerfile

Docerfile文件结构

Geos编译需要的CMakeLists.txt

  • 2016年07月01日 15:14
  • 4KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CmakeLists.txt protobuf编译
举报原因:
原因补充:

(最多只允许输入30个字)