由于项目需要用到protobuf——谷歌protobuf的是google的一个强大的网络传输协议,protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。考虑到很多人使用vs的编译工具,描述将protobuf添加到vs的项目中。
1.准备工作
在使用之前需要下载protobuf源码,以及编译工具,这里通常采用cmake来编译,通过cmake来编译可以使用命令提示符来编译,也可以使用cmake的可视化工具进行。在编译前提前下载好相关的源码:
1.下载 protocolbuffer源码, https://github.com/google/protobuf/releases
并解压;
2.安装cmake工具和vs工具,这是我使用的是vs2013;在安装过程中记得选择“写入环境变量”,或者安装过后自行在环境变量里添加Cmake目录下bin所在路径,方便在命令行使用Cmake 。安装完成,打开cmd,输入cmake --help,如下证明安装成功。
特别注意:根据你的需求以及使用vs版本下载相应protobuf版本的源码,并不是最新的就适合,因为vs2013不支持c++11的特性,所以,下载protobuf的时候,最好下载3.1之前的版本,这里我下载的是protobuf-cpp-3.1.0,如果你使用vs2015及以上的版本可以下载更高的版本需要。否则编译会出问题;
2. 编译protobuf源码
1.首先解压protobuf-cpp-3.1.0压缩包,在E:\protobuf-cpp-3.1.0目录下,新建一个install文件夹,编译之后的include和lib文件会放在里面。(其实不自己创建的话,后面会自己生成。)如下:
2.接下来,打开,VS2013开发人员命令提示(点击,开始->所有程序->Visual Studio 2013->Visual Studio Tools,进入如下界面)
3. 进入protobuf目录下的cmake目录,操作如下图所示:
在cmake目录下创建build目录,并且进入
此外,在下载的protobuf目录下,找到cmake文件夹,新建build文件夹,如下图所示:
mkdir build & cd build
4.创建release和debug版本的目录。(注意,二者选其一,根据你的项目需求选择,一定要一一对应!这里把两个版本相关的命令都写上,但是本文后面的示例,是按照debug版本使用的。)
4.1.release版本:
1)创建release目录并且进入:
mkdir release & cd release
2)生成Makefile文件:
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../../../../install ../..
3)nmake进行编译:
nmake
4)安装include头文件,lib库文件等,会放在一开始创建的install文件夹中:
nmake install
4.2. debug版本:
1)创建debug目录并且进入:
mkdir debug & cd debug
2)生成Makefile文件:
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../../../../install ../..
3)nmake进行编译:
nmake
4)安装include头文件,lib库文件等,会放在一开始创建的install文件夹中:
nmake install
至此,debug和release版本都编译成功了,以debug为例,在文件夹下,会生成如下文件:
在install文件夹下,会生成需要的头文件和库文件如下:
3.protobuf在vs2013中的使用
打开vs2013,新建一个空项目,进行如下配置:
1)进入项目属性页->配置属性->链接器->常规->附加库目录,加入之前debug生成的目录(因为本文测试用例以debug为例,所以选择debug目录)如下:
2)进入项目属性页->配置属性->链接器->输入->附加依赖项,加入依赖项如下
libprotobufd.lib
libprotocd.lib
3)进入项目属性页->配置属性->C/C+±>代码生成->运行库,选择多线程(/MT)
4)进入项目属性页->配置属性->C/C+±>常规->附加包含目录,加入先前在install文件夹下生成的头文件include的目录,如下:(这个是针对一些没有包含库文件的错误!!)
5)进入项目属性页->配置属性->链接器->输入->忽略特定默认库,加入LIBCMT.lib(这个是针对,LIBCMT重定义的错误!!!)
配置完成之后,就可以在项目的头文件中定义自己需要的数据协议并使用了。