最近有在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++ > 常规 > 附加包含目录。
- 修改项目设置中的配置属性 > C/C++ > 代码生成 > 运行库为
/MT
或/MD
(Release)或者/MD
或/MDd
(Debug). - 在项目设置中添加protobuf链接库目录,配置属性 > 连接器 > 常规 > 附加库目录,注意要指定与你选定的运行库模式一样的(
/MD
//MT
),不然会报错。 - 在项目设置中添加protobuf链接文件,我们需要的是
libprotobuf.lib
与libprotoc.lib
,在配置属性 > 连接器 > 输入 > 附加依赖项。
设置完成后,下面是一段简单的测试代码,从protobuf序列化为文件,再从文件中反序列化:
1 |
|
注意:protobuf生成的代码可能会有一些语法或性能上的警告,可以根据实际情况关闭VS的某些警告,我使用的禁用的几个警告如下(放置在包含头文件的首部):
1 |
编译成功运行的结果如下: