最近有在VS中用到Protobuf,简单记录一下使用MSVC构建Protobuf的流程。
本文介绍的在windows上编译protobuf的方法有几个软件要求:
- Git
- cmake
- visual studio
首先拉取protobuf源码:
1 | $ git clone -b 3.5.x git@github.com:google/protobuf.git protobuf-3.5.x |
再拉取googletest:
1 | $ git clone git@github.com:google/googletest.git |
然后目录跳转到protobuf-3.5.x/cmake下:
1 | $ cd protobuf-3.5.x/cmake |
执行下列命令,"Visual Studio 14 2015"根据实际情况改成你自己的visualstudio版本,具体的可以通过使用命令cmake -G查看,注意要指定架构[arch]信息,不指定Win64则默认为Win32。DCMAKE_INSTALL_PREFIX指定的后续protobuf的安装目录(拷贝编译出的文件)。
1 | cmake -G "Visual Studio 14 2015 Win64" -DCMAKE_INSTALL_PREFIX="~/protobuf" |
不出错误的话执行如下:
此时会在cmake下生成protobuf.sln以及extract_includes.bat等文件。
首先,执行extract_includes.bat会把protobuf需要用到的.h和.cpp拷贝(include/google文件夹)到camke目录里来。
然后使用VS打开protobuf.sln,红框中改成Release,右键ALL_BUILD点生成(其实一般也就只需要protobuf和protoc)。
注意:如果在Unreal中使用Protobuf的话,编译运行库选项需要修改为
/MD(Release)和/MDd(Debug)。

执行成功后,cmake目录下会有=产生一个Release目录。
此时编译的工作已经搞定了。
但是编译出来的文件都在cmake目录下面,为了方便使用,需要把我们编译出来安装出来(也就只将编译出来的文件放到前面-DCMAKE_INSTALL_PREFIX="~/protobuf"中指定的目录)。
只需要在VS中对INSTALL项目执行生成:
然后此时的~/protobuf的目录结构应如下:
1 | protobuf/ |
然后把Protobuf/bin、Protobuf/lib以及Protobuf/include添加到系统PATH路径即可。
附上我编译好的protobuf_v3.5.1,其中的lib/MD和lib/MT是不同的多线程运行时库,其中debug的为/MTd和/MDd以及Release的/MD和/MT。
然后就可以写个简单的测试用例了:
1 | // zlp.PeopleInfo.proto |
使用protoc生成.h和.cpp:
1 | $ protoc zlp.PeopleInfo.proto --cpp_out=./ |
会在当前zlp.PeopleInfo.proto目录下生成zlp.PeopleInfo.pb.cc和zlp.PeopleInfo.pb.h。
- 然后使用VS新建一个控制台项目,并将上面生成的两个文件添加到项目中来。
- 在项目设置中添加protobuf的头文件包含目录,配置属性 > C/C++ > 常规 > 附加包含目录。
![protobuf-add-include-folder]()
- 修改项目设置中的配置属性 > C/C++ > 代码生成 > 运行库为
/MT或/MD(Release)或者/MD或/MDd(Debug).![protobuf-setting-libraray-thread-mode]()
- 在项目设置中添加protobuf链接库目录,配置属性 > 连接器 > 常规 > 附加库目录,注意要指定与你选定的运行库模式一样的(
/MD//MT),不然会报错。![protobuf-add-link-library-folder]()
- 在项目设置中添加protobuf链接文件,我们需要的是
libprotobuf.lib与libprotoc.lib,在配置属性 > 连接器 > 输入 > 附加依赖项。![protobuf-add-link-library-file]()
设置完成后,下面是一段简单的测试代码,从protobuf序列化为文件,再从文件中反序列化:
1 |
|
注意:protobuf生成的代码可能会有一些语法或性能上的警告,可以根据实际情况关闭VS的某些警告,我使用的禁用的几个警告如下(放置在包含头文件的首部):
1 |
编译成功运行的结果如下:




