VS编译protobuf
① 如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信
1.下载protobuff,我下的是2.3.0版本
最新的protobuf可以到Google Code上下载:http://code.google.com/p/protobuf/downloads/list
当前版本为2.3.0,下载两个压缩包:protoc-2.3.0-win32.zip和protobuf-2.3.0.zip,前者是protobuf的编译器,后者包含了有三程序语言的开发包。
2.解压
首先解压protoc-2.3.0-win32.zip,把protoc.exe文件放到path路径中,最简单的做法就是把这个文件拷贝到C:/WINDOWS目录下。
解压protobuf-2.3.0.zip文件,将文件加压到C盘根目录,主文件位于C:/protobuf-2.3.0/protobuf-2.3.0目录下。
3.安装操作
(1)使用VS2005编译proto,VS工程目录位于vsprojects目录中,工程名字为“protobuf.sln”。
(2)选择“生成”à“生成解决方案”选项进行编译,编译过程中可能会由于编译的顺序报错误,可以使用手工逐个顺序编译生成,可能会比较顺利。按照下图的顺序,右键“重新生成”,逐个编译。但是我在实习操作过程中,libprotobuf-lite工程重来都没有成功编译通过过。淡定先,这个不会影响大局的。
(3)编译完成会在目录vsprojects下的Debug目录中生成lib和exe文件。
生成清单如下:
exe文件:
2010-04-15 09:51 950,272 lite-test.exe
2010-04-15 09:50 3,219,456 protoc.exe
2010-04-15 09:48 9,228,288 tests.exe
2010-04-15 09:56 2,519,040 test_plugin.exe
lib文件:
2010-04-15 09:50 2,685,922 libprotobuf-lite.lib
2010-04-15 09:56 24,100,794 libprotobuf.lib
2010-04-15 09:56 17,302,068 libprotoc.lib
其实我在测试过程中,lite-test.exe和libprotobuf-lite.lib并没有生成,因为编译错误了,但这并不影响大局,淡定先。
(4)OK,至此,我们已经完成了编译工作,下面需要进行的是protobuf的测试。我们需要使用到之前VS编译出来的libprotobuf.lib和libprotoc.lib完成一个C/S结构的SOCKET通信测试。
àProtobuf的测试
在VS2005下,创建两个新的工程,分别命名为server和client,每个工程都需要引用protobuf的头文件和lib文件。
一、添加protobuf头文件操作:右击项目à属性à配置属性àC/C++à常规 (也命令行可在中添加)。具体路径:C:/protobuf-2.3.0/protobuf-2.3.0/src
二、添加protobuf的lib文件操作:右击项目à属性à配置属性à链接器à常规(也可在命令行中添加)。具体路径:C:/protobuf-2.3.0/protobuf-2.3.0/vsprojects/Debug
三、CMD窗口下编译生成头文件:
C:/protobuf-2.3.0/protobuf-2.3.0/examples>protoc -I=./ --cpp_out=./ people.proto
将proto文件生成的文件放到当前目录。
② 编译protobuf
在编译osgearth3.5过程中,遇到了链接protobuf库的问题。起初使用了最新版本protobuf-28.0-rc1,通过cmake配置后成功编译。但在后续编译中,链接protobuf时出现错误。怀疑可能是版本问题,尝试使用较旧版本protobuf-3.4.0,发现cmake配置出现错误。将BUILD_TESTS选项取消并勾选BUILD_SHARED_LIBS,解决了链接问题,同时添加了zlib依赖。然而,生成的VS工程编译时仍报错,追踪到libprotobuf头文件hash.h中std::hash_compare未定义。通过添加_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS宏,解决了此问题。接着遇到了libprotobuf-lite工程编译问题,发现降级VS版本至VS2013即可解决,但并非预期结果。因此,选择protobuf-3.6.1版本进行编译,此版本在cmake配置时遇到与3.4.0类似错误,但libprotobuf-lite工程能够成功编译。tests工程报错,但不影响整体编译,卸载后,通过编译INSTALL工程实现了安装。在编译osgearth时,需在依赖protobuf的工程中添加预定义宏_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS,否则会报错。经过重新编译protobuf-28.0-rc1版本,发现只需将其编译为动态库(勾选BUILD_SHARED_LIBS选项)即可满足osgearth需求。此外,编译protobuf-28.0-rc1时还需添加abseil-cpp、googletest和jsoncpp库的源码,需从各自源码库下载并解压至对应文件夹。总之,明确版本兼容性问题,正确配置cmake选项,是解决此问题的关键。