如何编译安装 protocolBuffer(for C++)

一、简述

今天这一篇文章讲一讲 protocolBuffer 的编译安装步骤。首先了解一下什么是protocolBuffer。(以下摘自百度百科),如果还不不明白,go on 百度一下。

protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。

二、编译步骤

1、下载源码

官网地址:https://developers.google.com/protocol-buffers/.

官网提供了两个下载选项。

这里写图片描述

第一个选项Protocol buffers downloads and instructions

打开之后,我们看到最新的源码已经迁移至GitHub,所以下载源码直接打开这个链接,跳转到GitHub之后便可以下载。

这里写图片描述

第二个选项 The latest protocol buffers code and release。

这里是不同语言对应的 protocol buffers 源码包。所以这里下载的包相对第一个选项中下载的包会相对小一点,而且这里下载的包中包含了gmock模块(下面会涉及到此模块的应用)。

这里写图片描述

下面我们对比一下两个选项下载的包有什么不同。左图为所有版本的包,右图为C++版本的包。
我们看到右图中多了gmock文件夹,而左图多了类似java、php、python等这样的文件夹,这也说明了这两个包的区别,一般如果是指针对某种语言进行开发,下载第二个选项中的包即可。

这里写图片描述 这里写图片描述

2、编译源码

如何编译源码,其实我们下载的包中有详细的说明,而下面我们就按照官方文档进行编译源码。

我们对下载的包进行解压,然后在根目录中我们找到 README.md文件。打开我们会看到下面一段介绍。也就是说protocol的编译器是用C++编写的,如果我们将protocol 用于C++,就根据根据src目录下的README.md文件去编译安装protocol

The protocol compiler is written in C++. If you are using C++, please follow
the [C++ Installation Instructions] (src/README.md) to install protoc along
with the C++ runtime.

那我们直接去看src目录下的README.md文件就好了。这里对于Unix和Window系统中安装protocol分别做了介绍。

这里只介绍Windows系统的,如果Unix系统的小伙伴可以直接看文件中的介绍。文档中又让我们去看cmake目录下的README.md文件,一波三折,看了这么多,原来最终的安装步骤就在cmake目录下的README.md文件中了。

C++ Installation - Windows

If you only need the protoc binary, you can download it from the release
page:

https://github.com/google/protobuf/releases

In the downloads section, download the zip file protoc-$VERSION-win32.zip.
It contains the protoc binary as well as public proto files of protobuf
library.

To build from source using Microsoft Visual C++, see [cmake/README.md] (../cmake/README.md).

直奔主题,打开cmake目录下的README.md文件,我们看到详细的说明、安装步骤,下面我就直接给大家介绍如何编译安装了,有兴趣的小伙伴也可以对照文档说明进行编译。

(1)打开命令提示符

我是安装的VS2015,所以打开 VS2015 x64本机工具命令提示符。

这里写图片描述

(2)切换目录到你需要安装protocolBuffer的目录

这里我新建了一个probuf文件夹,然后将下载的protocolbuf源码拷贝到该文件夹下,并创建一个install文件夹(可以手动创建或者使用命令:mkdir install)。

这个install文件夹就是编译完之后头文件、lib等文件的目录。

这里写图片描述 这里写图片描述

(3)安装cmake编译工具

如果电脑上没有安装cmake,可以去官网下载最新的cmake安装包,然后将cmake.exe的路径添加到环境变量Path中。

cmake官网:https://cmake.org/

可以使用命令 set PATH=%PATH%;cmake.exe的路径;
such as : set PATH=%PATH%;C:\Program Files (x86)\CMake\bin

(4)CMake 配置

进入到下载源码文件夹下的cmake文件夹下,然后创建build文件夹并进入到此文件夹。

这里写图片描述

在build文件夹下,我们需要构建debug版本和release版本。所以需要创建这两个文件夹。

对于每个版本进入到该目录下使用下面的命令即可。

debug :

cmake -G “NMake Makefiles” ^
-DCMAKE_BUILD_TYPE=Debug ^
-DCMAKE_INSTALL_PREFIX=../../../../install ^
../..

release

cmake -G “NMake Makefiles” ^
-DCMAKE_BUILD_TYPE=Release ^
-DCMAKE_INSTALL_PREFIX=../../../../install ^
../..

这里写图片描述

执行nmake

这里写图片描述

(5)安装编译好的protobuf

执行nmake install

这里写图片描述

执行完之后我们会在之前创建的install文件夹下看到这几个文件夹。到达这里我们的编译安装工作已经完成,下面就可以使用了。

这里写图片描述

下面是文档中给出对这几个文件夹的介绍:

bin - that contains protobuf protoc.exe compiler;
include - that contains C++ headers and protobuf *.proto files;
lib - that contains linking libraries and CMake configuration files for protobuf package.

(6)安装编译中可能遇到的问题

如果大家下载的源码中不包含gmock文件夹的话,编译的时候会报错。如果从上面所说的第二个选项中下载的不同语言对应的 protocol buffers 源码包,那么会包含gmock模块,如果是从第一个选项中下载的是不包含此模块的。

所以第一种方法就是下载第二个选项的源码包,第二种方法就是修改源码包中cmake文件夹下的CMakeLists.txt文件,跳过gmock的编译(gmock模块用于protobuf的单元测试)。

下方是官方文档给的说明,也就是上面所说的两种方法。

Protobuf unit-tests require gmock to build. If you download protobuf source code
from the releases page, the gmock directory should already be there. If you checkout
the code via git clone, this gmock directory won’t exist and you will have to
download it manually or skip building protobuf unit-tests.

第一种方法就不给大家介绍了,直接去官网下载即可。

第二种方法,我们打开cmake文件夹下的CMakeLists.txt文件,然后找到protobuf_BUILD_TESTS字段,将后面的ON改成OFF即可。

这里写图片描述

(7)检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug”

遇到这种问题,一般是我们我们项目的运行库是MDd,而加载的lib文件是MTd,所以导致编译出错。

所以我们如果不修改CMakeLists.txt文件中的配置项时,默认生成的lib库为MTd(debug版本)或者MT(release版本)

如果要MDd版本的lib文件,那么就得修改CMakeLists.txt,如何修改,见下方。
将下图中红色标记的地方改成MD即可。

这里写图片描述

所以可以生成MDd、MD、MTd、MT四种不同的运行库。debug版本生成的库末尾带’d’,标识debug版本的库。我们在使用的时候需要注意不同的版本用不同的库。

这里写图片描述

猜你喜欢

转载自blog.csdn.net/goforwardtostep/article/details/77197389