这里写自定义目录标题

  • 前置准备
  • 编译zlib
  • 写一个zlib的demo
  • 编译protobuf
  • 写一个demo

前置准备

  1. 安装visual studio
  2. 安装cmake

编译zlib

  1. 下载zlib的源代码,并解压
  2. 运行cmake。source code打开zlib-1.2.11/build binaries选择zlib-1.2.11/cmake/build。这里默认会生成visualstudio工程,位于build目录下。打开工程,编译install项目,则会把zlib的include和lib等复制到C:\Program files(x86)/zlib下。
  3. 点击cmake的ConfigureGenerate
  4. 进入build目录,visual studio打开zlib.sln。选择想要的编译目标(如release,x64),编译ALL_BUILD和INSTALL。这里projectzlib的编译结果是动态库,包含lib和dll。
  5. 查看C:\Program files(x86)/zlib下,已有includelibbin等。其下已包含若干h,lib,dll文件。

写一个zlib的demo

  1. visual studio新建project。
  2. project的属性里VC++目录包含目录添加C:\Program Files (x86)\zlib\include链接器常规附加库目录添加C:\Program Files (x86)\zlib\lib。输入的附加依赖项添加zlib.lib
  3. project添加cpp文件:
#include <zlib.h>
#include <array>
#include <memory>
using namespace std;int main() {const size_t lenSrc = 60000;array<unsigned char, lenSrc> src = { 0 };uLong lenDest = compressBound(lenSrc);unique_ptr<Bytef[]> des = make_unique<Bytef[]>(lenDest);int retCompress = compress2(des.get(), &lenDest, src.data(), lenSrc, Z_BEST_COMPRESSION);switch (retCompress) {case Z_OK:printf("lenDest=%d\n", lenDest);break;case Z_MEM_ERROR:case Z_BUF_ERROR:throw retCompress;break;default:throw retCompress;}uLong lenDest2 = 65535;unique_ptr<Bytef[]> des2 = make_unique<Bytef[]>(lenDest2);retCompress = uncompress(des2.get(), &lenDest2, des.get(), lenDest);switch (retCompress) {case Z_OK:printf("actual size of the uncompressed data=%d\n", lenDest2);break;case Z_MEM_ERROR:throw "there was not enough memory";break;case Z_BUF_ERROR:throw "there was not enough room in the output buffer";break;case Z_DATA_ERROR:throw "the input data was corrupted or incomplete";break;default:throw retCompress;}return 0;
}
  1. 编译
  2. 运行时,还缺zlib.dll。可将dll放到exe同级目录下。或者把zlib.dll所在目录加入PATH。

编译protobuf

  1. 下载protobuf的cpp源码,如protobuf-cpp-3.13.0.tar.gz。再解压
  2. 运行cmake。source code打开protobuf-3.12.4/cmakebuild binaries选择protobuf-3.12.4/cmake/build。这里默认会生成visualstudio工程,位于build目录下。简单起见,就勾选protobuf_BUILD_PROTOC_BINARIES。打开工程,编译install项目,则会把protobuf的include和lib等复制到C:\Program files(x86)/protobuf下。
  3. 点击cmake的ConfigureGenerate
  4. 进入build目录,visual studio打开protobuf.sln。选择想要的编译目标(如release,x64),编译ALL_BUILD和INSTALL。这里projectlibprotobuf的编译结果是静态库,仅lib。
  5. 查看C:\Program files(x86)/zlib下,已有includelibbin等。其下已包含若干h,lib,exe文件。
  6. binprotoc.exe是protobuf的预编译器。通过它,我们能把proto文件编译为h和cpp文件。

写一个demo

  1. 新建specprinter.proto文件,随便写点东西。
syntax = "proto3";enum PathFreq {HKLM=0;HKCU=1;HKCR=2;HKU=3;HKCC=4;MODEL=5;PRINTERNAME=6;//SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\PrintersSMWCP=7;resevered8=8;resevered9=9;resevered10=10;resevered11=11;resevered12=12;resevered13=13;resevered14=14;resevered15=15;resevered16=16;
}message MsgPathUnit {oneof PathUnit {PathFreq freq = 1;string normal = 2;};
}message Path {repeated MsgPathUnit unit=1;}message MapPath {map<uint32, Path> Config=1;}message Paths {repeated uint32 p = 1;}message MapConfig {map<string, Paths> Config = 1;}message SpecConfig {string s = 1; MapPath mappath = 2;MapConfig mapconfig = 3;
}
  1. cmd里使用protoc,编译specprinter.proto
    protoc.exe specprinter.proto --cpp_out=.
    随后,能看到specprinter.pb.hspecprinter.pb.cc
  2. 新建visual studio工程protobufdemo.project。将hcc加入工程。将c:\program files(x86)\protobuf的include和lib加入工程的对应搜索路径。
  3. main.cpp里写下如下代码:
#include <iostream>
#include <memory>
#include <fstream>
#include <sstream>
#include <zlib.h>
#include "specprinter.pb.h"
using namespace std;int main()
{PathFreq pathfreq0, p1, p2, p3, p4, p5, p6, p7, p8, p9;{pathfreq0 = PathFreq::HKLM;p1 = PathFreq::HKCU;p2 = PathFreq::HKCR;p3 = PathFreq::HKU;p4 = PathFreq::HKCC;p5 = PathFreq::MODEL;p6 = PathFreq::PRINTERNAME;p7 = PathFreq::SMWCP;p8 = PathFreq::resevered8;p9 = PathFreq::resevered9;}Path pa0, pa1, pa2, pa3, pa4, pa5, pa6, pa7, pa8, pa9, pa10, pa11, pa12, pa13, pa14, pa15, pa16, pa17;{pa0.add_unit()->set_freq(pathfreq0);pa0.add_unit()->set_normal("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers");pa0.add_unit()->set_freq(p5);pa0.add_unit()->set_freq(p6);pa0.add_unit()->set_normal("ChangeID");pa1.add_unit()->set_freq(p1);pa1.add_unit()->set_normal("SOFTRE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers");pa1.add_unit()->set_freq(p5);pa1.add_unit()->set_freq(p6);pa1.add_unit()->set_normal("Status");pa2.add_unit()->set_normal("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers");pa2.add_unit()->set_freq(p5);pa2.add_unit()->set_freq(p6); pa2.add_unit()->set_normal("DsKeyUpdateForeground");pa3.add_unit()->set_freq(p3);pa3.add_unit()->set_normal("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers");pa3.add_unit()->set_freq(p5);pa3.add_unit()->set_freq(p6);pa3.add_unit()->set_normal("Default DevMode");pa4.add_unit()->set_freq(p4);pa4.add_unit()->set_freq(p3);pa4.add_unit()->set_normal("SOFTWARE\\Micrsoft\\idows NT\\CurretVersion\\Print\\Pinters");pa4.add_unit()->set_freq(p5);pa4.add_unit()->set_freq(p6);pa5.add_unit()->set_normal("pa4");pa5.add_unit()->set_freq(p3);pa4.add_unit()->set_normal("SOFTWARE\\Micrsoft\\idows NT\\CurretVersion\\Print\\Pinters");pa5.add_unit()->set_freq(p5);pa5.add_unit()->set_freq(p6);pa6.add_unit()->set_freq(p6);pa5.add_unit()->set_freq(p3);pa4.add_unit()->set_normal("SFTWARE\\Micrsft\\idows NT\\CurtVersion\\Print\\Pinters");pa5.add_unit()->set_freq(p5);pa6.add_unit()->set_freq(p6);pa6.add_unit()->set_freq(p3);pa6.add_unit()->set_normal("SOFTWARE\\Micrsoft\\idows NT\\CurretVersion\\Print\\Pinters");pa6.add_unit()->set_freq(p5);pa6.add_unit()->set_freq(p6);pa7.add_unit()->set_freq(p7);pa7.add_unit()->set_freq(p7);pa7.add_unit()->set_normal("SOFTWARE\\Micrsoft\\idows NT\\Curretersion\\Prit\\Pers");pa7.add_unit()->set_freq(p7);pa8.add_unit()->set_freq(p8);pa8.add_unit()->set_freq(p7);pa8.add_unit()->set_normal("SOFTARE\\Micrsoft\\idows NT\\Curretersion\\Prit\\Pers");pa8.add_unit()->set_freq(p8);pa9.add_unit()->set_freq(p9);pa9.add_unit()->set_normal("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers");pa9.add_unit()->set_freq(p5);pa9.add_unit()->set_freq(p6);pa9.add_unit()->set_normal("ChangeID");pa10.add_unit()->set_normal("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers");pa10.add_unit()->set_normal("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers");pa10.add_unit()->set_freq(p5);pa10.add_unit()->set_freq(p6);pa10.add_unit()->set_normal("ChangID");pa11.add_unit()->set_normal("SOFTWAR\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers");pa12.add_unit()->set_normal("SOFTWARE\\Micosoft\\Windows NT\\CurrentVersion\\Print\\Printers");pa12.add_unit()->set_freq(p5);pa12.add_unit()->set_freq(p6);pa12.add_unit()->set_normal("ChangD");pa12.add_unit()->set_normal("SOFTWARE\\icrosoft\\Windows NT\\CurrentVersion\\Print\\Printers");pa13.add_unit()->set_normal("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers");pa13.add_unit()->set_freq(p5);pa13.add_unit()->set_freq(p6);pa13.add_unit()->set_normal("ChaID");pa13.add_unit()->set_normal("SOFTWARE\\Microsoft\\indows NT\\CurrentVersion\\Print\\Printers");pa14.add_unit()->set_normal("SOFTWARE\\Microsof\\indows NT\\urentVersion\\Print\\Printers");pa14.add_unit()->set_normal("SOFTWARE\\Microsoftndows NT\\CurrentVersion\\Print\\Printers");pa14.add_unit()->set_freq(p5);pa14.add_unit()->set_freq(p6);pa14.add_unit()->set_normal("ChaneID");pa15.add_unit()->set_normal("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\rint\\Printers");pa15.add_unit()->set_normal("SOFTWARE\\Micsoft\\WindCurrentVersion\\Print\\Printers");pa15.add_unit()->set_freq(p5);pa15.add_unit()->set_freq(p6);pa15.add_unit()->set_normal("ChaID");pa16.add_unit()->set_normal("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\rinters");pa16.add_unit()->set_normal("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers");pa16.add_unit()->set_freq(p5);pa16.add_unit()->set_freq(p6);pa16.add_unit()->set_normal("asdf322ChangeID");pa17.add_unit()->set_normal("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printer");pa17.add_unit()->set_normal("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers");pa17.add_unit()->set_freq(p5);pa17.add_unit()->set_freq(p6);pa17.add_unit()->set_normal("ChasdfadeeqngeID");}MapPath mappath;{mappath.mutable_config()->operator[](0) = pa0;mappath.mutable_config()->operator[](1) = pa1;mappath.mutable_config()->operator[](2) = pa2;mappath.mutable_config()->operator[](3) = pa3;mappath.mutable_config()->operator[](4) = pa4;mappath.mutable_config()->operator[](5) = pa5;mappath.mutable_config()->operator[](6) = pa6;mappath.mutable_config()->operator[](7) = pa7;mappath.mutable_config()->operator[](8) = pa8;mappath.mutable_config()->operator[](9) = pa9;mappath.mutable_config()->operator[](10) = pa10;mappath.mutable_config()->operator[](11) = pa11;mappath.mutable_config()->operator[](12) = pa12;mappath.mutable_config()->operator[](13) = pa13;mappath.mutable_config()->operator[](14) = pa14;mappath.mutable_config()->operator[](15) = pa15;mappath.mutable_config()->operator[](16) = pa16;mappath.mutable_config()->operator[](17) = pa17;}//std::string str = mappath.SerializeAsString();//printf("str.size=%zd\n", str.size());SpecConfig specconfig;specconfig.set_s("123");specconfig.set_allocated_mappath(&mappath);Paths ps0, ps1, ps2, ps3, ps4, ps5, ps6, ps7, ps8, ps9, ps10, ps11, ps12, ps13, ps14;{ps0.add_p(0); ps0.add_p(1); ps0.add_p(2); ps0.add_p(3); ps0.add_p(4); ps0.add_p(5);ps1.add_p(6); ps1.add_p(1); ps1.add_p(2); ps1.add_p(3); ps1.add_p(4); ps1.add_p(5);ps2.add_p(6); ps2.add_p(7); ps2.add_p(2); ps2.add_p(3); ps2.add_p(4); ps2.add_p(5);ps3.add_p(6); ps3.add_p(7); ps3.add_p(8); ps3.add_p(3); ps3.add_p(4); ps3.add_p(5);ps4.add_p(6); ps4.add_p(7); ps4.add_p(8); ps4.add_p(9); ps4.add_p(4); ps4.add_p(5);ps5.add_p(6); ps5.add_p(7); ps5.add_p(8); ps5.add_p(9); ps5.add_p(10); ps5.add_p(5);ps6.add_p(6); ps6.add_p(7); ps6.add_p(8); ps6.add_p(9); ps6.add_p(10); ps6.add_p(11);ps7.add_p(12); ps7.add_p(7); ps7.add_p(8); ps7.add_p(9); ps7.add_p(10); ps7.add_p(11);ps8.add_p(12); ps8.add_p(13); ps8.add_p(8); ps8.add_p(9); ps8.add_p(10); ps8.add_p(11);ps9.add_p(12); ps9.add_p(13); ps9.add_p(14); ps9.add_p(9); ps9.add_p(10); ps9.add_p(11);ps10.add_p(12); ps10.add_p(13); ps10.add_p(14); ps10.add_p(15); ps10.add_p(10); ps10.add_p(11);ps11.add_p(12); ps11.add_p(13); ps11.add_p(14); ps11.add_p(15); ps11.add_p(16); ps11.add_p(11);ps12.add_p(12); ps12.add_p(13); ps12.add_p(14); ps12.add_p(15); ps12.add_p(16); ps12.add_p(17);ps13.add_p(18); ps13.add_p(13); ps13.add_p(14); ps13.add_p(15); ps13.add_p(16); ps13.add_p(17);ps14.add_p(18); ps14.add_p(19); ps14.add_p(14); ps14.add_p(15); ps14.add_p(16); ps14.add_p(17);}MapConfig mapcfg;auto mc = mapcfg.mutable_config();(*mc)["hp color LaserJet Pro M452 PCL 6"] = ps0;(*mc)["HP LaserJet MFP M227-M231 PCL 6(V3)"] = ps1;(*mc)["DASCOM DS-1700"] = ps2;(*mc)["SNBC BTP-L2-BPLA"] = ps3;(*mc)["ZDesigner GK888t(EPL)"] = ps4;(*mc)["ASDFzewqqSDFdsfaCCVCQQ3#Q"] = ps5;(*mc)["wqr42342aswerqwecxzvsdfrtwrwrew"] = ps6;(*mc)["2asweraczvfgqew2 sarerw"] = ps7;(*mc)["zcvzwrqw wer2344 2q43q5dg as"] = ps8;(*mc)["artwert;;jqij4;qt f fs"] = ps9;(*mc)["f.l/xmv.tq;qawq4rp adf2"] = ps10;(*mc)["3242asrqw3q4t adfacvbc asd3"] = ps11;(*mc)["2qraszxcvnxcqewq42q asqw44"] = ps12;(*mc)["q4rqwerad442314323425551123"] = ps13;(*mc)["q4zafzvza1313412 rtwartewrt"] = ps14;//auto str2 = mapcfg.SerializeAsString();//printf("str2.size=%zd\n", str.size());specconfig.set_allocated_mapconfig(&mapcfg);auto str3 = specconfig.SerializeAsString();printf("str3.size=%zd\n", str3.size());specconfig.release_mappath();specconfig.release_mapconfig();//压缩spec_printer.conf主体uLongf compressedstr3sz = compressBound(str3.size());Bytef* compressedstr3 = (Bytef*)malloc(compressedstr3sz);int retCompress = compress2(compressedstr3, &compressedstr3sz, (const Bytef*)(str3.data()), str3.size(), Z_BEST_COMPRESSION);if (retCompress != Z_OK) {throw retCompress;}printf("compressedstr3sz=%d\n", compressedstr3sz);SpecConfig sc2;if (!sc2.ParseFromString(str3)) {throw 1;}MapConfig mapcfg2 = sc2.mapconfig();auto paths2 = mapcfg2.config().at("hp color LaserJet Pro M452 PCL 6");auto paths20 = paths2.p();MapPath mappath2 = sc2.mappath();for (auto it = paths20.cbegin(); it != paths20.cend(); ++it) {printf("pathid=%d\n", *it);Path pathtmp = mappath2.config().at(*it);auto sz = pathtmp.unit_size();printf("sz=%d\n", sz);for (int i = 0; i < sz; ++i) {auto pathunit = pathtmp.unit(i);if (pathunit.PathUnit_case() == MsgPathUnit::kFreq) {printf("\t%d\n", pathunit.freq());}else {printf("\t%s\n", pathunit.normal().c_str());}}}uLongf szDest = 2 * str3.size();Bytef* compressedDest = (Bytef*)malloc(szDest);if (compressedDest == NULL) {throw 2;}int err = compress2(compressedDest, &szDest, (const Bytef*)(str3.data()), str3.size(), Z_BEST_COMPRESSION);//int err = compress(compressedDest, &szDest, (const Bytef*)(str3.data()), str3.size());if (err != Z_OK) {printf("err=%d\n");}else {printf("szDest=%d\n", szDest);}#if 0//压缩超大detailifstream t("m452.default.json");stringstream buffer;buffer << t.rdbuf();std::string contents(buffer.str());printf("contents.size()=%d\n", contents.size());szDest = 2 * contents.size();Bytef *compressedDest3 = (Bytef*)malloc(szDest);compress2(compressedDest3, &szDest, (const Bytef*)(contents.data()), contents.size(), Z_BEST_COMPRESSION);printf("szDest=%d\n", szDest);t.close();t.open("m227.default.json");buffer.str("");buffer << t.rdbuf();contents = buffer.str();printf("contents.size()=%d\n", contents.size());szDest = 2 * contents.size();Bytef* compressedDest4 = (Bytef*)malloc(szDest);compress2(compressedDest4, &szDest, (const Bytef*)(contents.data()), contents.size(), Z_BEST_COMPRESSION);printf("szDest=%d\n", szDest);t.close();
#endifreturn 0;
}
  1. 在proto中,已定义message类型SpecConfig包含map类型成员MapConfig。这里可用specconfig.set_allocated_mapconfig(&mapcfg);赋值。但是如果mapcfg是局部变量,须尽快调用specconfig.release_mapconfig();。因为SpecConfig析构时会deletemapconfig_mapconfig_恰好是局部变量的地址。因此,若不release,在SpecConfig析构时会崩溃。

visualstudio下zlib和protobuf编译环境备忘相关推荐

  1. python ubuntu18.04 sublime_Ubuntu下Sublime配置python编译环境及新手使用指导:

    Sublime下配置python编译环境及搭建虚拟环境:(windows下大致相同) 1.编译环境配置 2019-3-6更新教程,发现好像 官方网址打不开了,要改一下源才行. 解决办法: 点击 Pre ...

  2. android swstnw cn,Android应用开发之ubuntu14.04编译ijkplayer备忘

    本文将带你了解Android应用开发之ubuntu14.04编译ijkplayer备忘,希望本文对大家学Android有所帮助 1.   i|VIhzkKCf#3UUnstall gi[e-RkYJ4 ...

  3. Windows下的gcc/gc++编译环境配置

    最近有很多算法设计的网络大赛,其中大部分的C/C++都是采用Linux下的GCC/G++编译器.配置GCC编译器大概有这几种途径:装Linux系统.装Linux虚拟机或者在Windows环境下模拟Li ...

  4. ubuntu下android源码编译环境,ubuntu12.04 64位上搭建android源码编译环境

    1.首先替换源为163的源,默认源下载速度太慢 sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup (备份下当前的源列表) sudo ...

  5. Windows下魔兽世界服务器通用编译环境搭建教程

    必要的编译环境软件: 对应软件 你可以去官方下载或者在文章最后的链接处进行下载 boost_1_69_0-msvc-14.1-64 cmake-3.13.2-win64-x64 ACE-6.5.0 W ...

  6. Windows下Fortran语言的编译环境之CodeBlocks配置

    Fortran编译环境配置(Windows)--CodeBlocks的下载与安装 安装包的下载 最新版本的 CodeBlocks 的下载 旧版本的 CodeBlocks 的下载 CodeBlocks的 ...

  7. ubuntu14.04下Andriod2.3.1编译环境的搭建

    准备工作:获取andriod2.3.1的源码包,以及对应的jdk1.6.0.26. 1.编译andriod2.3.1需要gcc4.4的版本,但是ubuntu14.04自带的版本比这个高.需要通过以下指 ...

  8. 以下不能在python编译环境_win7 下解决python 集成编译环境IDLE无法打开的问题。...

    安装官方的python带Idle但是却无法打开,百度谷歌了几种解决方法,加上自己的实际境况予以解决. 我的python是直接安装在C盘下的. 1.首先是设置环境变量: Path=C:\Python31 ...

  9. Linux 下的 FFmpeg 安装编译环境配置总结

    1. 安装编译 官网下载地址:http://ffmpeg.org/ 官网安装指导 : http://trac.ffmpeg.org/wiki/CompilationGuide(并选择对应平台) 在安装 ...

最新文章

  1. Java EE---Spring AOP
  2. C++学习笔记第二天:几个知识点
  3. @RequestMapping报404错误问题解决
  4. 摇杆控制方向原理_医用无油空压机的送料作用及工作原理
  5. 通过QuartzCore/CoreAnimation.h实现让玫瑰花飞舞
  6. [渝粤教育] 西南民族大学 数据结构 参考 资料
  7. python工作区是什么_在IPython中保存工作区
  8. 必须重视针对SCADA系统的***
  9. 连载8:时域信号相乘相当于频域卷积
  10. SecureCRT更改字体
  11. C语言实现--背包问题 算法(Knapsack Problem)
  12. 易语言组合框基本属性方法事件
  13. 重置IE浏览器的设置
  14. 从零开始SpringCloud Alibaba实战(47)——阿里开发手册泰山版学习笔记一 命名风格
  15. 夏普电视服务器维修,夏普液晶电视机通病维修方法
  16. 个人作业4 结对开发地铁
  17. 【小程序“600002“】现象:小程序测试版能正常的进行页面跳转,正式版不能进行页面跳转
  18. 使用docker创建mysql容器
  19. ARM-Cortex-M架构寄存器详解
  20. 【uview calendar日历 】 u-view 2.0 的日历组件默认是无法选择当天之前的日期,解决方法

热门文章

  1. 【uniapp,样式,登录】【微信小程序】获取用户昵称和头像 uni.getUserProfile 废弃 后 新规则 写法
  2. vuecrud钩子_42、前端基础-Vue-生命周期和钩子函数
  3. 安卓手机用WIFI无线调试adb
  4. 问题 E: 古希腊之争(一)(bfs迷宫裸模板)
  5. 2021年起重机械指挥考试资料及起重机械指挥模拟考试题
  6. SQL__存储过程__创建
  7. 2023最新爆火的抖音权重查询网站源码+API接口/算法已优化
  8. Java常用类库学习总结
  9. 前端小白移动端布局总结(含四大实战项目)及笔记
  10. 云计算的优势与未来发展趋势