protobuf的下载、编译和使用
一 背景
工作中临时需要使用 protobuf v3.0.2 做消息格式转换,折腾了很久才搞定,这里特意做一个记录。
二 准备工作
全程使用的电脑为公司的win7 64位旗舰版,已经预先安装VS2013和cmake3.10.2,需要注意的是,如果cmake版本过低,编译时会提示失败,需要更新的cmake版本,重新执行操作。
下载protobuf源代码,公司内网可以访问github,因此选择从github直接下载ZIP包:v3.0.2.zip,这里解压到 “D:\Documents\Program\Tools”。
三 编译
这里以编译32位的debug版本为例,如果是release版本,可以将各条命令中的debug路径修改为release路径,最关键的一点是将第5条命令中的 “-DCMAKE_BUILD_TYPE=Debug” 修改为 “-DCMAKE_BUILD_TYPE=Release”。
选择“开始 - 所有程序 - Visual Studio 2013 - Visual Studio Tools”,双击“VS2013 x86 本机工具命令提示”,依次输入:
(1)cd D:\Documents\Program\Tools\protobuf-3.0.2\cmake
(2)mkdir build & cd build
(3)mkdir x86 & cd x86
(4)mkdir debug & cd debug
此时位于protobuf-3.0.2/cmake/build/x86/debug,这里创建的debug文件夹只是用于存放相关的cmake file配置信息,无特殊含义。
(5)cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug -Dprotobuf_BUILD_TESTS=OFF -DCMAKE_INSTALL_PREFIX=../../../../install/x86/debug ../../..
生成cmake file相关配置文件。
(6)nmake
等待protobuf编译完成,大概10分钟。
(7)nmake install
完成后会在 protobuf-3.0.2\install\x86\debug 目录下生成 bin、include、lib、cmake 四个文件夹。
bin文件夹中的 protoc.exe 程序可以直接拿来转换.proto文件,此处不做介绍。
四 lib库的使用
为了能够动态地创建message对象,修改message参数,需要调用上面编译出的lib库文件,利用protobuf中的反射机制实现。
新建C++工程,工程右键,选择属性,配置头文件和lib库文件,注意第2点:
(1)“C/C++ - 常规 - 附加包含目录”,新增 “D:\Documents\Program\Tools\protobuf-3.0.2\install\x86\debug\include”;
(2)”C/C++ - 代码生成 - 运行库”,选择 “多线程调试(/MTd)”,与protobuf保持一致,否则编译不过;
(3)“链接器 - 常规 - 附加库目录”,新增 ”D:\Documents\Program\Tools\protobuf-3.0.2\install\x86\debug\lib”;
(4)”链接器 - 输入 - 附加依赖项”,新增 “libprotobufd.lib;libprotobuf-lited.lib;libprotocd.lib;”
在编译v3.0.2版本之前,也尝试过最新的v3.3.0版本,编译过程都没有出问题,在使用lib库时,编译出错,先是 “generated_message_table_driven.h” 文件找不到,后是 “metadata_lite.h” 文件找不到,我从 “protobuf-3.3.0\src\google\protobuf” 文件夹下将这两个头文件copy到 “protobuf-3.3.0\install\x86\debug\include\google\protobuf” 中,编译通过(同样需要按第四步进行配置),这应该是版本自身的Bug。
参考博客:https://www.cnblogs.com/tongy0/p/7119778.html
protobuf的下载、编译和使用的更多相关文章
- 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)
分类: Android 系统开发(5) 作者同类文章X 版权声明:本文为博主原创文章 ...
- (1)redis下载编译
一.redis下载编译 这里没什么好说的 用的版本是redis-2.8.17 1)redis-server是可执行程序 2)mian函数在redis.c里面 3)如果要修改调试 这届在src目录下 ...
- 下载编译Chrome详细步骤
文章来源:http://blog.csdn.net/allendale/article/details/9262833 参考:http://dev.chromium.org/developers/ho ...
- 更新vs2017 15.9.2后,在指定-T v141_xp情况下载编译会报下面warning MSB8051
更新vs2017 15.9.2后,在指定-T v141_xp情况下载编译会报下面warning: C:\Program Files (x86)\Microsoft Visual Studio\2017 ...
- Spring源码研究--下载-编译-导入eclipse-验证
一,环境配置 操作系统:Unbutu14.04LTS JDK: 1.8.0_40 git: 1.9.1 gradle: 2.2.1 二,源码下载-编译-导入eclipse-验证 1,下载 使用git直 ...
- webrtc所有平台下载编译步骤详细说明
webrtc所有平台下载编译步骤详细说明 1.安装depot tools Windows:国外下载:https://storage.googleapis.com/chrome-infra/depot_ ...
- 下载编译 Android wear 源代码,尝试制作可穿戴设备功能
体验 Android Wear 缘由: Android wear 代码公布已经非常久了.一直没有尝试,这里是个编译的过程和步骤,假设要尝试.本文假定读者已经有下载编译 Android 的经验,假设没 ...
- Android 程序分析环境搭建-Android 9 -代码下载编译
Android 9 -代码下载编译 一,翻墙下载: 1.背景: 背景: 现在Android framework 开发的同学,整体在公司里面解一些无关痛痒的bug,对于Android framework ...
- protobuf 系列 ---------下载、编译与使用
protobuf是谷歌开发并开源的二进制序列化工具,比常用的xml,json体积更小,解析速度更快. 目前,手头上的项目有涉及到这个工具,打算仔细研究一番,顺带记录遇到的问题,解决方法,时间足够的话, ...
随机推荐
- rpm软件包管理的详细解读
CentOS系统上使用rpm命令管理程序包:安装.卸载.升级.查询.校验.数据库维护 1.基本安装 rpm -ivh PackageFile 2.rpm选项 rpm -ivh --test Packa ...
- BIOS基础
Basic Input Output System 基本输入输出系统 固化到主板上-个 ROM芯片上的 程序 为计算机提供最底层.最直接的的硬件设置和控制 以上来自百度 不讨论时软件还 ...
- SDVO-DVI-I2C-register
关于DVI视频输出口,微软搞了个SDVO用来保护: #define SDVO_OUTPUT_FIRST (0) #define SDVO_OUTPUT_TMDS0 (1 << 0) ...
- R语言︱文本挖掘——词云wordcloud2包
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者看到微信公众号探数寻理中提到郎大为Chif ...
- MySQL通过localhost无法连接数据库的解决
问题:一台服务器的PHP程序通过localhost地址无法连接数据库,但是如果设置为127.0.0.1则可以正常连接,连接其他数据库服务器也正常.MySQL的权限设置正确,且通过mysql命令行客户端 ...
- linux下面的fd限制
如果不考虑内存大小的限制,在linux下面,fd (即file descriptor)的数量来自2个限制(阈值).其一:是操作系统的限制.这个限制主要是在linux内核中,我们知道,用户程序的fope ...
- PHP常见错误
1.关于单引号和双引号的区别. $sql="insert into tableName values ('".$name."','".$email." ...
- FusionCharts报错收录
FusionCharts报错 1.错误一 DesignTimeError:#25081843 flash-chart render Error >>#25081843:IECompatib ...
- List、Map和Set的实现类
List.Map和Set的实现类 1.List实现类 (1)ArrayList (2)Vector 2.Map实现类 (1)HashMap (2)Hashtable 3.Set实现类 (1)HashS ...
- Java 第六章
第六章 for语法:for(表达式①;表达式②;表达式③){ //④循环操作}表达式含义:表达式1:赋值语句, 它用来给循环变量赋初值 例如:int i = 1;表达式2:循环条件,一个关系表达式, ...