工做中临时须要使用 protobuf v3.0.2 作消息格式转换,折腾了好久才搞定,这里特地作一个记录。html
全程使用的电脑为公司的win7 64位旗舰版,已经预先安装VS2013和cmake3.10.2,须要注意的是,若是cmake版本太低,编译时会提示失败,须要更新的cmake版本,从新执行操做。git
下载protobuf源代码,公司内网能够访问github,所以选择从github直接下载ZIP包:v3.0.2.zip,这里解压到 “D:\Documents\Program\Tools”。github
这里以编译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\cmakeui
(2)mkdir build & cd buildgoogle
(3)mkdir x86 & cd x86线程
(4)mkdir debug & cd debugdebug
此时位于protobuf-3.0.2/cmake/build/x86/debug,这里建立的debug文件夹只是用于存放相关的cmake file配置信息,无特殊含义。3d
(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文件,此处不作介绍。
为了可以动态地建立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