Thrift框架-Windows-C++编译

Thrift简介    

    Thrift是Facebook提供的一个跨语言的服务部署框架,可以实现客户端和服务器远程过程调用。相较于Google的grpc框架,Thrift对三方库依赖更少,编译更简单,并且运行效率也更高。Thrift只依赖boost、openssl和libevent三个库,测试demo只依赖openssl静态库,因此可以暂不编译boost和libevent,只需要在编译thrift的时候,引入boost源文件和libevent头文件即可。下面详细介绍thrift 0.13.0的编译过程。


一、编译boost

1、下载并解压boost源码

下载boost源码,下载地址:https://www.boost.org/,下载后对比MD5,如果没问题,直接解压即可:

Thrift框架-Windows-C++编译_第1张图片

2、生成boost编译工具b2.exe

打开VS工具命令提示(例如VS2019为:x64 Native Tools Command Prompt for VS 2019), 定位到boost目录,执行下面的命令:

>.\bootstrap.bat

执行成功后,会在boost目录下生成b2.exe。

Thrift框架-Windows-C++编译_第2张图片

3、编译boost

执行下面的命令编译boost:

>b2.exe stage --toolset=msvc-14.2 address-model=64 --stagedir="E:\code\boost_1_74_0\CompileResult" threading=multi --build-type=complete --without -python link=static release

 --toolset参数:需要和VS的平台工具集版本一致,否则编译thrift链接boost时,会出现版本不一致导致找不到对应的boost静态链接库的问题。

查看VS的平台工具集方法:打开任意VS项目,查看项目属性--配置属性--常规--平台工具集:

Thrift框架-Windows-C++编译_第3张图片

address-model参数:指定静态库是32位还是64位;

stagedir参数:编译结果目录

4、编译结果

编译成功后,会在<stagedir>目录下生成对应的boost静态链接库:

Thrift框架-Windows-C++编译_第4张图片

5、验证boost

新建VS工程,导入boost头文件和静态库,执行下面的代码验证boost是否编译成功:

#include 
#include 
#include 
int main()
{
	boost::regex pattern("\\w+@\\w+(\\.\\w+)*");
	std::string mail("[email protected]");

	if (boost::regex_match(mail, pattern)) {
		std::cout << mail << " is a valid mail address!" << std::endl;
	}
	else {
		std::cout << mail << " is not a valid mail address!" << std::endl;
	}
}


二、编译openssl

1、下载并解压openssl源码

下载openssl源码,下载地址:https://www.openssl.org/source/,下载后对比MD5,如果没问题,直接解压即可:

Thrift框架-Windows-C++编译_第5张图片

2、安装编译工具ActivePerl

安装完成后,执行下面的命令查看安装是否成功:

>perl -v

安装成功会有如下提示:

Thrift框架-Windows-C++编译_第6张图片

然后,执行命令安装dmake.exe:

>ppm install dmake

dmake安装成功,会有如下提示:

Thrift框架-Windows-C++编译_第7张图片

3、配置openssl编译环境

打开Developer Command Prompt for VS 2019,定位到openssl目录,执行命令配置openssl编译环境:

>perl Configure VC-WIN64A

(VC-WIN64A表示编译64位动态库)

4、编译openssl

执行命令:

>nmake

如果编译报错,则:

设置INCLUDE环境变量,包含VS系统头文件路径和Windows Kits系统头文件路径,例如:

(注意替换成自己的VS安装目录和Windows Kits目录)

E:\VS2019\VC\Tools\MSVC\14.27.29110\include;

C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt;

C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um;

C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\shared

设置PATH环境变量,包含Windows Kits目录下的rc.exe路径,例如:

(注意替换成自己的Windows Kits目录)

C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x64

设置LIB环境变量,包含Windows Kits系统静态库路径,例如:

(注意替换成自己的Windows Kits目录)

C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\um\x64

C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\ucrt\x64

E:\VS2019\VC\Tools\MSVC\14.27.29110\lib\x64

Thrift框架-Windows-C++编译_第8张图片

5、编译结果

编译成功后,在openssl目录下搜索*.lib,将所有静态库拷贝出来即可:

Thrift框架-Windows-C++编译_第9张图片


三、编译libevent

1、下载并解压libevent源码

下载libevent源码,下载地址为:http://libevent.org/

Thrift框架-Windows-C++编译_第10张图片

2、修改libevent配置文件

修改Makefile.nmake文件中的LIBFLAGS变量,增加/MACHINE:X64选项以生成64为静态库:

LIBFLAGS=/nologo /MACHINE:X64

Thrift框架-Windows-C++编译_第11张图片

3、编译libevent

然后打开x64 Native Tools Command Prompt for VS 2019,定位到libevent目录,执行编译命令

>nmake -f Makefile.nmake

 

Thrift框架-Windows-C++编译_第12张图片

4、编译结果

编译成功生成libevent.lib、libevent_core.lib、libevent_extras.lib三个静态库:

5、libevent验证

新建VS工程,导入libevent头文件和静态库,执行下面的代码验证libevent是否编译成功:

#include 
#include 

int main()
{
    const char *version = event_get_version();
    printf("%s\n",version);
    return 0;
}


四、编译thrift

1、下载并解压thrift源码

下载thrift源码,下载地址为:http://thrift.apache.org/download

或者:https://downloads.apache.org/thrift/

2、拷贝thrift依赖的头文件

将对应的boost、openssl、libevent的头文件拷贝到thrift项目对应的路径下,并修改项目的头文件引用目录:

Thrift框架-Windows-C++编译_第13张图片

3、修改代码

(1)修改thrift_export.h,添加#define thrift_EXPORTS

打开\lib\cpp\src\thrift\thrift_export.h,在文件中添加#define thrift_EXPORTS

由于我们需要编译thrift生成静态链接库,因此需要添加定义:#define thrift_EXPORTS,将THRIFT_EXPORT设置为__declspec(dllexport)。

Thrift框架-Windows-C++编译_第14张图片

(2)如果出现下面的错误,则将报错的地方的

#include <thrift/config.h>

修改为

#include <config.h>

直接引用根目录下的config.h头文件

error msg:无法打开包括文件: “thrift/config.h”: No such file or directory

(3)修改thrift根目录下的config.h,注释掉部分宏定义,以屏蔽引用某些linux下的头文件:

error msg:无法打开包括文件: “netinet/in.h”: No such file or directory

Thrift框架-Windows-C++编译_第15张图片

(4)concurrency筛选器下面的部分源文件名称与源码目录下的文件名称不一致,需要移除后重新添加:

Thrift框架-Windows-C++编译_第16张图片

4、编译thrift

打开\thrift-0.13.0\lib\cpp下的VS工程文件,直接编译libthrift项目即可,注意在项目工程上右键:》属性-》c/c++-》代码生成-》运行库,选择多线程 (/MT)

Thrift框架-Windows-C++编译_第17张图片

5、编译结果

编译成功后,会在\lib\cpp\x64\Release目录下生成libthrift.lib

你可能感兴趣的:(C++)