[ protobuf c++ ] protobuf + vs2013编译安装_protobuf2.5.0 vs-程序员宅基地

技术标签: protobuf  c++  vs2013  

1:下载:

protobuf 2.5.0

压缩文件中包含 protobuf-2.5.0.tar.gz 和 protoc-2.5.0-win32.zip,protobuf-2.5.0.tar.gz是protobuf的源文件,protoc-2.5.0-win32.zip是一个protoc.exe应用文件,用于把传输类编译成.h和.cc文件。把 protoc-2.5.0-win32.zip 解压后的目录添加到系统的环境变量中。打开cmd,输入protoc -h 有相应的提示,表示成功。

 

2:编译

(1):打开protobuf-2.5.0的解压文件的vsprojects中工程文件protobuf.sln,编译:libprotobuf 有错误:

1>..\src\google\protobuf\io\zero_copy_stream_impl_lite.cc(121): error C3861: “min”:  找不到标识符
1>..\src\google\protobuf\io\zero_copy_stream_impl_lite.cc(168): error C3861: “max”:  找不到标识符
1>..\src\google\protobuf\io\zero_copy_stream_impl_lite.cc(195): error C3861: “min”:  找不到标识符

则在文件中添加:#include <algorithm>头文件

(2):修改vs2013的编译强制copy检查,若不修改,编译对象文件的时候,会报_Copy_Imp的错误,修改libprotobuf工程下的repeated_field.h文件,修改如下:

namespace internal {
template <typename Element, bool HasTrivialCopy>
void ElementCopier<Element, HasTrivialCopy>::operator()(
    Element to[], const Element from[], int array_size) {
std::copy(from, from + array_size, stdext::checked_array_iterator<Element*>(to, array_size));
  //std::copy(from, from + array_size, to);
}

(3):最后一个个编译工程,生成libprotobuf.lib,libprotobuf-lite.lib,libprotoc.lib,lite-test.exe,protoc.exe,test_plugin.exe,tests.exe

 

3:添加测试工程文件:

新建控制台文件testprotobuf.sln工程

新建protobuf_lib文件夹,把上面编译的lib文件copy到这个文件下。

新建protobuf_src文件夹,把protobuf-2.5.0的源文件下的src文件夹下的所有文件copy到此文件夹下。

新建Person.proto文件,内容如下:

  1. package Test;  
  2. message Person   
  3. {  
  4.    required string name = 1;  
  5.    required int32 id = 2;  
  6.    optional string email = 3;  
  7. }  

打开cmd,输入命令:

protoc -I=E:\work\testProtobuf --cpp_out=E:\work\testProtobuf E:\work\testProtobuf\Person.proto

把相应的目录换成.proto文件所在的目录即可,完成后会生成两个文件:Person.pb.h,Person.pb.cc,然后添加到工程中。

 

4:添加源文件的头文件。

添加lib,【属性】-【链接器】-【输入】-【附加依赖项】把上面的三个lib添加进来

在包含lib所在的库文件:【属性】-【链接器】-【常规】-【附加库本目录】:$(SolutionDir)\protobuf_lib

添加测试源码:

  1. #include "stdafx.h"  
  2. #include "..\Person.pb.h"  
  3. #include <iostream>  
  4. #include <fstream>  
  5.   
  6.   
  7. int _tmain(int argc, _TCHAR* argv[])  
  8. {  
  9.     GOOGLE_PROTOBUF_VERIFY_VERSION;  
  10.   
  11.     Test::Person person;  
  12.     person.set_id(123);  
  13.     person.set_name("abc");  
  14.     person.set_email("[email protected]");  
  15.   
  16.     std::cout << "Before:" << std::endl;  
  17.     std::cout << "ID:" << person.id() << std::endl;  
  18.     std::cout << "name:" << person.name() << std::endl;  
  19.     std::cout << "email:" << person.email() << std::endl;  
  20.   
  21.     std::string str;  
  22.     person.SerializeToString(&str);  
  23.   
  24.     Test::Person person2;  
  25.     person2.ParseFromString(str);  
  26.   
  27.     std::cout << "After:" << std::endl;  
  28.     std::cout << "ID:" << person2.id() << std::endl;  
  29.     std::cout << "Name:" << person2.name() << std::endl;  
  30.     std::cout << "Email:" << person2.email() << std::endl;  
  31.   
  32.   
  33.     system("pause");  
  34.   
  35.     return 0;  
  36. }  

结果如下:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/SUNQIQI2121/article/details/51024705

智能推荐

【开发】新大陆物联网云平台C#获取数据_c#物联网采集数据-程序员宅基地

文章浏览阅读1.9k次,点赞2次,收藏16次。使用C#SDK连接新大陆物联网云平台获取数据开发环境资料下载代码开发环境Visual Studio 2015NET Framework 4.6资料下载SDK:新大陆下载 微云下载代码using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows;using System.Windo_c#物联网采集数据

QML State类型,实现状态切换,图片切换等效果(一)_qml状态变换,图标切换-程序员宅基地

文章浏览阅读5.2k次,点赞5次,收藏10次。QML中所有基于Item的对象都有一个state属性,依赖于状态驱动的情况下,都可以用State类型的一组属性设置: 1. 显示一些组件而隐藏其他组件; 2. 为用户呈现不同的动作; 3. 开始、停止或者暂停动画; 4. 执行一些需要在新的状态中使用的脚本; 5. 显示一个不同视图或者画面; 举例一:import QtQuick 2.2Item { wid..._qml状态变换,图标切换

[转]全球付虚拟卡申请流程~-程序员宅基地

文章浏览阅读2.9k次。转自:http://jy.smzdm.com/detail/18235小编注:Global Cash的服务让大家多了一个有效的支付渠道,但根据之前海淘妹子年前的调研,其在实际使用过程中可能会出现以下问题,希望大家积极讨论。1.充值的时候收取手续费的透明度有待提高。2.如果使用该账户支付后仍然被砍单等遇到的各种情况退款,退回款项只能存在Global Cash账户中,不能提现。作者在...

怎么清理c盘垃圾,台式机c盘满了怎么清理-程序员宅基地

文章浏览阅读322次,点赞10次,收藏8次。在Windows系统中,我们可以打开“运行”对话框,输入“sysdm.cpl”,然后点击“确定”。在Windows系统中,我们可以打开“运行”对话框,输入“%temp%”,然后点击“确定”。在Chrome浏览器中,我们可以打开“设置”菜单,选择“隐私设置”,然后选择“清除浏览数据”。在IE浏览器中,我们可以打开“工具”菜单,选择“Internet选项”,然后点击“删除”。然而,随着时间的推移,我们的台式机C盘可能会因为各种原因而变得满载,导致电脑运行缓慢,甚至出现系统崩溃的情况。2. 清除浏览器缓存。

protoc 编译proto 文件报错_-stream-stats-catapult-json-程序员宅基地

文章浏览阅读1k次。protoc 编译 proto 文件报错_-stream-stats-catapult-json

【LeetCode数据库】 题目总结——经典题目题解与分析(二)--简单难度_leetcode数据分析-程序员宅基地

文章浏览阅读331次。项目员工II销售分析I销售分析II销售分析III游戏玩法分析即时食物配送I每个帖子的评论数平均售价学生们参加各科测试的次数不同国家的天气类型求团队人数广告效果制作会话柱状图按日期分组销售产品消费者下单频率查找拥有有效邮箱的用户产品名称格式修复..._leetcode数据分析

随便推点

13、SQL Server:分页方法汇总_sqlserver 分页删除-程序员宅基地

文章浏览阅读411次。本文来自:http://www.cnblogs.com/EasonWu/archive/2012/09/21/2697326.html一直以来,SQL Server都是很多开发人员接触学习和使用最多的一个数据库,因为其简单而强大的管理工具,再加上不错的性能和超级高的使用场合。记得刚毕业那两年时间里在一个小团队里写了很多Store Procedure和Re_sqlserver 分页删除

艺工交叉“多视角交叉认知”主题作文_当代世界艺术与工业交叉作文-程序员宅基地

文章浏览阅读101次。我们大多数人认为科学是枯燥难懂的,在《发现的乐趣》中,费曼提到过有的艺术家甚至认为科学家太理性,是无法欣赏花朵的美丽的。但费曼认为科学家也会欣赏,而且科学会让人们从另一个角度感受到花的美感和神秘感。事实上就如演讲中提到的,科学都是在对自然的观察上发展而来的。在某种意义上科学就是对自然的里一个角度的认知。观察事物的角度不同,获得的信息也就会完全不同。对某个事物的认识本应是多方面的去了解,构成一个..._当代世界艺术与工业交叉作文

TreeMap是如何实现去重和排序的_treemap 怎么去重复-程序员宅基地

文章浏览阅读5.9k次,点赞7次,收藏24次。TreeMap实现了SortedMap接口,它是一个key有序的Map类。TreeMap的默认排序规则TreeMap并不是根据插入的顺序来排序,而是根据key元素的 compareTo 方法来排序。测试代码:Map<Integer, Object> map = new TreeMap<>();map.put(5, new Object());map.put(10, new Object());map.put(8, new Object());map.put(12, n_treemap 怎么去重复

编译原理-语法分析(自底向上)_自底向上语法分析-程序员宅基地

文章浏览阅读2.5k次,点赞3次,收藏15次。L31. Explanation of NounsCFG: Context-free grammar,上下文无关文法_自底向上语法分析

微信小程序种myChart.setOption报错空值null问题解决_微信小程序 echarts异步 setoption of null-程序员宅基地

文章浏览阅读3.4k次。微信小程序种myChart.setOption报错空值null问题解决1.在initChart中使用SetOption初始渲染option初始渲染时加载option中的初始数据这里一般不会出现报错问题,毕竟初始渲染之于option中的series有关2.进行数据(地图)重绘微信小程序它不支持同步操作!而那些微信官方提供的Demo都是写死的数据。实际上呢?都是从网上加载数据过来的,所以这个时候需要一个同步操作,也就是需要从网上加载完数据之后再次渲染(重绘)Echarts图表。Echarts默认是_微信小程序 echarts异步 setoption of null

启动模式,BOOT0和BOOT1详解-程序员宅基地

文章浏览阅读3.8k次,点赞5次,收藏34次。原文链接:http://blog.csdn.net/daunxx/article/details/40148945在画STM32的电路图的时候,关于STM32的启动方式纠结了一下,现有的参考设计都是在STM32的启动选择引脚BOOT0和BOOT1上使用了跳帽,用以人工选择STM32的启动方式,但是在实际应用中这种设计就显得冗余,所以这里顺带研究了一下STM32的启动方式。STM..._boot1 和 boot0 都默认接gnd