设为首页 收藏本站
查看: 911|回复: 0

[经验分享] 在Windows上一键编译各种版本的Protobuf

[复制链接]

尚未签到

发表于 2017-6-27 15:54:01 | 显示全部楼层 |阅读模式
  所需工具 : cmake  for  windows 和  git for windows
  原理:protobuf 是google的一个开源项目,其源代码在github上可以下载到,并且源码都采用cmake来构建,所以我们可以把源码下载到本地,然后了利用cmake构建本地工程,然后编译.
  步骤一:下载源码
  复制以下代码,保存到 download_protobuf_source.bat 文件中,运行即可



::参考文章 https://github.com/google/protobuf/blob/master/cmake/README.md
::默认当前操作系统已安装 git 和 cmake,并配置好了环境变量
echo off & color 0A
::设置所需要的Protobuf版本,最新版本可以在github上查到 https://github.com/google/protobuf
set PROTOBUF_VESION="3.0.0-beta-4"
echo %PROTOBUF_VESION%
set PROTOBUF_PATH="protobuf_%PROTOBUF_VESION%"
echo %PROTOBUF_PATH%
::从githug上拉取protobuf源代码
git clone -b %PROTOBUF_VESION% https://github.com/google/protobuf.git %PROTOBUF_PATH%
::从github上拉取gmock
cd %PROTOBUF_PATH%
git clone -b release-1.7.0 https://github.com/google/googlemock.git gmock
::从github上拉取gtest
cd gmock
git clone -b release-1.7.0 https://github.com/google/googletest.git gtest
pause
  步骤二:编译
  你可以利用cmake构建你所需要的版本,下面的的例子是构建并编译一个VS2013版本的protobuf
  例:构建VS2013版本
  复制以下代码,保存到 build_VS.bat 文件,放到 download_protobuf_source.bat 同级目录,然后执行
  例如
DSC0000.png




::参考文章 https://github.com/google/protobuf/blob/master/cmake/README.md
::默认当前操作系统已安装 git 和 cmake,并配置好了环境变量
echo off & color 0A
::设置所需要的Protobuf版本,最新版本可以在github上查到 https://github.com/google/protobuf
::必须与下载的版本一致
set PROTOBUF_VESION="3.0.0-beta-4"
echo %PROTOBUF_VESION%
set PROTOBUF_PATH="protobuf_%PROTOBUF_VESION%"
echo %PROTOBUF_PATH%
cd %PROTOBUF_PATH%
::设置VS工具集,相当于指定VS版本,取决于VS的安装路径
set VS_DEV_CMD="D:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\VsDevCmd.bat"
::设置工程文件夹名字,用来区分不同的VS版本
set BUILD_PATH="build_VS2013"
::设置编译版本 Debug Or Release
set MODE="Release"

cd cmake
if not exist %BUILD_PATH% md %BUILD_PATH%
cd %BUILD_PATH%
if not exist %MODE% md %MODE%
cd %MODE%
::开始构建和编译
call %VS_DEV_CMD%
cmake ../../ -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=%MODE%
call extract_includes.bat
nmake /f Makefile
echo %cd%
pause
  当然,你也可以的通过修改上面的的脚本来编译你所需要的VS版本,具体的参数注释的很详细
  当进度达到100%的时候,说明编译完成
DSC0001.png

  此时,所有的东西都已经生成,包括头文件 和 lib文件
DSC0002.png

  测试
  新建VS2013工程,设置好google/protobuf 头文件目录 和 lib库目录,链接到 libprotobuf.lib 或者 libprotobuf-lite.lib ,此处不赘述.
  新建 protocol.proto 文件,输入以下协议,需要注意的是,一定要加入 syntax = "proto2" 指定语法规则版本,否则在执行 protoc.exe 的过程中会报警告.如果不加也没有影响,默认为 proto2 的语法规则



// 指定语法规则 proto2 or proto3
syntax = "proto2";
message Book
{
optional string name = 1;
optional int32 pages = 2;
optional float price = 3;
}
message Student
{
optional int32 age = 1;
optional string name = 2;
optional float score = 3;
repeated Book arrBook = 4;
}
  新建生成协议脚本 gen.bat ,输入以下内容



@echo off & color 0A
:: protoc程序名
set "PROTOC_EXE=protoc.exe"
:: .proto文件名
set "PROTOC_FILE_NAME=protocol.proto"
set "PROTOC_PATH=%cd%"
set "CPP_OUT_PATH=%cd%"
::生成.h和.cc
"%PROTOC_PATH%\%PROTOC_EXE%" --proto_path="%PROTOC_PATH%" --cpp_out="%CPP_OUT_PATH%" "%PROTOC_PATH%\%PROTOC_FILE_NAME%"
pause
  把生成的 protocol.pb.h 和 protocol.pb.cc 加入到刚才的工程
  例如
DSC0003.png

  输入代码:



#include <stdio.h>
#include <stdint.h>
#include "protocol.pb.h"
int32_t main()
{
Student *student1 = new Student();
student1->set_age(1);
student1->set_name("tom");
student1->set_score(98.5);
for (uint32_t i = 0; i < 5; ++i)
{
char name[32] = { 0 };
sprintf_s(name, 32, "book_%d", i);
Book *pBook = student1->add_arrbook();
pBook->set_name(name);
pBook->set_price(1.2f * (i + 1));
pBook->set_pages((i + 1) * 15);
}
//printf("%s\n", student1->DebugString().c_str());
char buf[1024] = {0};
int32_t len = student1->ByteSize();
student1->SerializeToArray(buf, len);
printf("btye size = %d\n", len);
Student student2;
student2.ParseFromArray(buf, len);
printf("%s\n", student2.DebugString().c_str());
getchar();
return 0;
}
  注意事项:在属性面板中把运行库设置为 MT
DSC0004.png

  编译运行,成功,结果如下
DSC0005.png

  附:编译MinGW版本protobuf的脚本,与build_VS.bat大同小异
  文件:build_MinGW.bat
  内容:



::参考文章 https://github.com/google/protobuf/blob/master/cmake/README.md
::默认当前操作系统已安装 git 和 cmake 和 MinGW,并配置好了环境变量
echo off & color 0A
::设置所需要的Protobuf版本,最新版本可以在github上查到 https://github.com/google/protobuf
::必须与下载的版本一致
set PROTOBUF_VESION="3.0.0-beta-4"
echo %PROTOBUF_VESION%
set PROTOBUF_PATH="protobuf_%PROTOBUF_VESION%"
echo %PROTOBUF_PATH%
cd %PROTOBUF_PATH%

::设置工程文件夹名字
set BUILD_PATH="build_MinGW"
::设置编译版本 Debug Or Release
set MODE="Release"

cd cmake
if not exist %BUILD_PATH% md %BUILD_PATH%
cd %BUILD_PATH%
if not exist %MODE% md %MODE%
cd %MODE%
::开始构建编译
cmake ../../ -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=%MODE%
mingw32-make.exe
echo %cd%
pause

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-388791-1-1.html 上篇帖子: ansible管理windows实践 下篇帖子: Windows安装mxnet
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表