VS2015 Protobuf环境配置
VS2015 Protobuf环境配置
想通过某种方式由c++后台给c#前台传数据,Pinvoke不能操作太复杂的数据结构,因此想尝试一下protobuf。但是在搭建环境的时候就费了不少劲,说难不难就是看到的资料都过了蛮久不太好用。因此记录一下成功搭建的过程,以及遇到的一些错误的解决方法。
下载protobuf
下载链接: https://github.com/protocolbuffers/protobuf/tags. 我下载的是v3.12.0,偏最新的,操作起来应该差不多。接下来准备好cmake工具进行cmake。
下载cmake
Cmake的官网下载链接在外网,下起来剧费劲一直失败,搜到的国内链接还都是csdn需要付费的。不懂就问,还好我朋友早就发现了一个巨好用的渠道,下载贼快,链接: https://pc.qq.com/search.html#!keyword=cmake. 再次感叹企鹅粑粑的伟大。
cmake编译
安装好cmake之后,在下载的protobuf根目录下创建一个新目录build。运行cmake,选择好Source目录为根目录下cmake文件夹,Build目录就是刚才新建的目录。选好后点击左下方的Configure。会弹出一个选项应该是选择生成文件形式吧,我选的是VS2015。成功Configure之后如下,勾选项默认就好,点击Generate等待完成。
生成后的文件都在build目录下。
编译生成proto.exe
打开build目录找到cmake后得到的解决方案,打开直接编译即可。这一步我没有遇到报错。不过要注意编译时候模式选择的是Release还是Debug,这个会对最后根据协议生成的项目文件的使用产生影响,可能会出现一些配置不匹配的报错。这个后面会说明。这里编译就行。会根据编译模式的选择生成相应的Release或Debug文件夹。
Protobuf的使用
下面来配置protobuf。
- 首先根据协议写个例子。这里参考了一蓑烟雨1989. 并稍作修改。不然之后编译的时候会出现[libprotobuf WARNING protobuf-cpp-3.12.0\protobuf-3.12.0\src\google\protobuf\compiler\parser.cc:648] No syntax specified for the proto file: person.proto. Please use ‘syntax = “proto2”;’ or ‘syntax = “proto3”;’ to specify a syntax version. (Defaulted to proto2 syntax.) 这样的警告。虽然感觉就算警告也无伤大雅。
- 在根目录下examples文件夹下,新建一个文本文件,改名为person.proto,粘贴如下例子。
syntax = "proto2";
package tutorial;
message Person {
required string name = 1;
required int32 age = 2;
optional string email = 3;
}
- 打开cmd 进入到刚刚编译结束后的生成目录下,我的是Release目录。输入如下指令,之后会在examples目录内看到protobuf编译生成的person.pb.cc和person.pb.h两个文件,也就是之后将要添加到项目里的文件。
protoc -I=..\..\examples --cpp_out=..\..\examples ..\..\examples\person.proto
VS2015环境配置
- 新建一个c++空项目工程。将person.pb.cc和person.pb.h两个文件导入进项目内。
- 然后就是包含目录、库目录、链接库的常规配置。
打开属性,选择VC++目录
a.包含目录,导入protobuf-3.12.0\src所在路径,再分别导入protobuf-3.12.0\third_party\googletest下googlemock和googletest两个目录下的include目录。
b.库目录,导入编译protobuf生成的Debug或Release生成目录
c.选择链接器->附加依赖项,添加libprotobuf.lib和libprotoc.lib。 - 用如下测试代码编译测试,也是参考了一蓑烟雨1989。编译模式和cpu一定要和当时编译protobuf.sln保持一致,否则链接的库文件会因为不匹配而报错。
#include <iostream>
#include "person.pb.h"
#pragma comment(lib, "libprotobuf.lib")
#pragma comment(lib, "libprotoc.lib")
using namespace std;
using namespace tutorial;
int main()
{
Person person;
person.set_name("wangshubo");
person.set_age(26);
person.set_email("wangshubo1989@126.com");
cout << person.name() << endl;
cout << person.age() << endl;
cout << person.email() << endl;
system("pause");
return 0;
}
一些报错处理
如果编译失败报错error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”,在工程上右键->属性->c/c+±>代码生成->运行库
改成(release为MT,debug为MTD)即可解决。参考https://blog.csdn.net/u013157963/article/details/51689616?utm_source=blogxgwz2。
如果编译报错如导入的pb.cc和pb.h文件中一些类函数找不到,则检查在修改编译模式之后是否重新设置包含目录等属性配置。