Thrift简介
Thrift是Facebook提供的一个跨语言的服务部署框架,可以实现客户端和服务器远程过程调用。相较于Google的grpc框架,Thrift对三方库依赖更少,编译更简单,并且运行效率也更高。Thrift只依赖boost、openssl和libevent三个库,测试demo只依赖openssl静态库,因此可以暂不编译boost和libevent,只需要在编译thrift的时候,引入boost源文件和libevent头文件即可。下面详细介绍thrift 0.13.0的编译过程。
一、编译boost
下载boost源码,下载地址:Boost C++ Libraries,下载后对比MD5,如果没问题,直接解压即可:
打开VS工具命令提示(例如VS2019为:x64 Native Tools Command Prompt for VS 2019), 定位到boost目录,执行下面的命令:
>.\bootstrap.bat
执行成功后,会在boost目录下生成b2.exe。
>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项目,查看项目属性--配置属性--常规--平台工具集:
address-model参数:指定静态库是32位还是64位;
编译成功后,会在<stagedir>目录下生成对应的boost静态链接库:
新建VS工程,导入boost头文件和静态库,执行下面的代码验证boost是否编译成功:
#include <iostream>
#include <string>
#include <boost/regex.hpp>
int main()
{
boost::regex pattern("\\w+@\\w+(\\.\\w+)*");
std::string mail("xxx@gmail.com");
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
下载openssl源码,下载地址:/source/index.html
2、安装编译工具ActivePerl和NASM
安装成功会有如下提示:
下载并安装 NASM 汇编器,并将 NASM 安装路径添加到系统环境变量 Path 中。
下载地址:https://www.nasm.us/https://www.nasm.us/
例如:nasm-2.13.01-installer-x64.exe
安装成功会有如下提示:
2.3 安装dmake.exe
>ppm install dmake
dmake安装成功,会有如下提示:
依次打开:开始菜单 -- 所有程序 -- Visual Studio 2019 -- Visual Studio Tools -- VC -- x64 Native Tools Command Prompt for VS 2019
注意这里一定不要选错了,编译64位就选择 x64 Native Tools Command Prompt for VS 2019,如果选错了则需要重新解压openssl到一个空目录重新编译,亲测在原目录使用nmake clean && nmake无效。
打开 x64 Native Tools Command Prompt for VS 2019,定位到openssl目录,执行命令配置openssl编译环境:
perl Configure VC-WIN64A no-asm no-shared --prefix=E:\code\oci-lib\openssl
VC-WIN64A:表示编译64位动态库,如果编译debug版本,则改成debug-VC-WIN64A,如果编译32位版本,则改成VC-WIN32;
no-asm:表示不使用汇编;
no-shared:表示静态链接;
prefix:编译目标路径;
4、编译openssl
nmake
三、编译libevent
下载libevent源码,下载地址为:libevent
修改Makefile.nmake文件中的LIBFLAGS变量,增加/MACHINE:X64选项以生成64为静态库:
然后打开x64 Native Tools Command Prompt for VS 2019,定位到libevent目录,执行编译命令
>nmake -f Makefile.nmake
编译成功生成libevent.lib、libevent_core.lib、libevent_extras.lib三个静态库:
新建VS工程,导入libevent头文件和静态库,执行下面的代码验证libevent是否编译成功:
#include <event.h>
#include <stdio.h>
int main()
{
const char *version = event_get_version();
printf("%s\n",version);
return 0;
}
四、编译thrift
下载thrift源码,下载地址为:Apache Thrift - Download
将对应的boost、openssl、libevent的头文件拷贝到thrift项目对应的路径下,并修改项目的头文件引用目录:
(1)修改thrift_export.h,添加#define thrift_EXPORTS
打开<thrift目录>\lib\cpp\src\thrift\thrift_export.h,在文件中添加#define thrift_EXPORTS。
由于我们需要编译thrift生成静态链接库,因此需要添加定义:#define thrift_EXPORTS,将THRIFT_EXPORT设置为__declspec(dllexport)。
#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
(4)concurrency筛选器下面的部分源文件名称与源码目录下的文件名称不一致,需要移除后重新添加:
4、编译thrift
打开\thrift-0.13.0\lib\cpp下的VS工程文件,直接编译libthrift项目即可,注意在项目工程上右键:》属性-》c/c++-》代码生成-》运行库,选择对应的运行库加载模式,这里必须和调用 libthrift 的上层项目工程的配置一致。
多线程(/MT)与多线程(/MD)的区别:VS中的多线程(/MT)、多线程调试(/MTd)、多线程DLL(/MD)、多线程调试DLL(/MDd)的区别_深山里的小白羊的博客-CSDN博客_多线程调试 多线程调试dll