当前位置: 首页 > 编程日记 > 正文

windows下rpc框架thrift的环境配置

windows下rpc框架thrift的环境配置

引用链接:
https://www.cnblogs.com/49er/p/7193829.html

最近在弄windows下 的Facebook的rpc 框架 thrift ,
网上东西看了很多, 但是大都不能一篇到位, 这里总结了一下,
也记一下自己遇到的问题和解决的方法

这里把我在实际过程中遇见的问题,以及问题的解决方法写一下:

1、版本问题:

基本是参照现这个版本来的:

  • Windows 10
  • Microsoft Visual Studio 2017
  • Apache Thrift 0.9.2.
  • Boost 1.72.0.
  • libevent-2.1.11-stable
  • OpenSSL 1.0.2l

2、概述

总体有两种思路,一种是利用virtual studio 的nuget 包管理工具,编译安装thrift以及其libevent,boost,openssl这几个依赖库,

一种是从这些各自的官网,或者git-hub上下载源码编译安装,但是由于我本地的nuget一直无法连接(有vpn),遂放弃这种方式

这个方式的指导连接在这里:

https://blog.csdn.net/xie1xiao1jun/article/details/53332504

3、实际问题

1、openssl, 原文的openssl编译安装方式写的部分地方不正确 以下是纠正部分:

https://blog.csdn.net/fm0517/article/details/91578554

4. 打开VS命令行工具

VS2013 x64 本机工具命令提示,进入目录下面的目录中
D:\ProgramIDE\Microsoft Visual Studio 12.0\VC\bin\amd64
执行命令:vcvars64.bat

5. 进入openssl源码目录下,执行配置

perl Configure VC-WIN64A no-asm --prefix=D:\360Downloads\openssl-1.0.2s
其中prefix后面的路径是源码路径。

2、libevet 配置文件找不到

使用libevent的问题
1)找不到<event2/event-config.h>
event-config.h在E:\libevent-2.1.8-stable\WIN32-Code\nmake\event2目录下,

因此编译完成后要把E:\libevent-2.1.8-stable\WIN32-Code\nmake下的所有文件和目录拷贝到E:\libevent-2.1.8-stable\include

以下是原文

Windows 10 Visual Studio 2017 安装配置 Apache Thrift (C++)
最近需要使用Thrift,所以在网上看了很多资料,不过很多教程都不够详细完整,导致我花了不少时间安装配置。在这里我把我配置的过程写下来和大家分享。

1 介绍
Apache Thrift 是一个跨语言的远程过程调用框架(RPC,Remote Procedure Call)。首先使用接口描述语言(IDL,Interface Description Language)编写 .thrift 文件,然后通过 Thrift 编译成C++、JAVA、C# 等语言的代码。这些代码之间可以互相远程调用。Thrift 封装了底层网络通信的内容,用户只需要编写顶层逻辑代码就可以了。

2 测试环境
Windows 10
Microsoft Visual Studio 2017
Apache Thrift 0.9.2.
Boost 1.64.0.
libevent-2.1.8-stable
OpenSSL 1.0.2l
3 使用 Visual Sdutio 2017 编译生成 libthrift.lib
下载安装Boost,记住**{Boost安装目录}。安装过程见Windows 10 Visual Studio 2017 安装配置 Boost。
下载安装OpenSSL,下载网址。安装过程见Windows 10 Visual Studio 2017 安装配置 OpenSSL。记住
{OpenSSL 目录}**
从 Apache Thrift 官网下载 Windows 平台的 Thrift 源代码和编译器。
下载libevent,非阻塞的 Thrift 服务器需要这个库。
解压缩下载的文件。
去**{thrift 安装目录}\lib\cpp 目录,点击thrift.sln**,打开 VS 项目,里面有两个项目libthrift 和 libthriftnb。
会有一个对话框询问是否升级,点击升级。
打开 Developer Command Prompt for VS 2017。

在 Developer Command Prompt 中进入 {libevent 安装目录}。
输入 nmake -f Makefile.nmake 来安装libevent。
完后后,右键 libthrift项目,点击属性 > C/C++ > 常规。
在附加包含目录中添加:
{boost 安装目录}\boost_1_64_0;{boost 安装目录}\boost_1_64_0\boost;{OpenSSL 目录}\inc32
点击库管理器 > 附加库目录,添加如下文件:
{OpenSSL 目录}\out32dll
右键 libthriftnb项目,点击属性 > C/C++ > 常规。在附加包含目录中添加
{boost 安装目录}\boost_1_64_0;{boost 安装目录}\boost_1_64_0\boost;{OpenSSL 目录}\inc32;{libevent_install_dir};{libevent_install_dir}\include;{libevent_install_dir}\WIN32-Code;
点击库管理器 > 附加库目录,添加如下文件:
{OpenSSL 目录}\out32dll
然后编译生成文件,如果使用DEBUG模式,会在**{thrift 目录}\lib\cpp\DEBUG**中生成libthrift.lib。
4 建立 Server、Client 示例
4.1 建立 Thrift C++ Server
创建Hello.thrift文件

Hello.thrift

namespace cpp Demo 
service Hello{ string helloString(1:string para) i32 helloInt(1:i32 para) bool helloBoolean(1:bool para) void helloVoid() string helloNull() } 

编译生成 C++ 源文件,会生成 gen-cpp文件夹

thrift -r --gen cpp Hello.thrift

生成的文件如下:

新建 Visual Studio 项目,并将生成的文件粘贴入项目文件夹中。

我们只需要实现Hello_server.skeleton.cpp中的方法即可。

右键项目,点击属性 > C/C++ > 常规 > 附加包含目录,添加:
{thrift 安装目录}\lib\cpp\src;{thrift 安装目录}\lib\cpp\src\thrift\windows;{boost 安装目录}\boost\boost_1_64_0;%(AdditionalIncludeDirectories)

点击链接器 > 常规 > 附加库目录,添加:

{boost 安装目录}\boost\boost_1_64_0\stage\lib;{thrift 安装目录}\lib\cpp\Debug;%(AdditionalLibraryDirectories)

点击链接器 > 所有选项 > 附加依赖项,添加:

libboost_thread-vc141-mt-gd-1_64.lib;libboost_chrono-vc141-mt-gd-1_64.lib;libthrift.lib;

如果是 0.91 之前的 thrift,还需要在Hello_server.skeleton.cpp源文件main函数前面加上如下代码:

WSADATA wsaData = {};
WORD wVersionRequested = MAKEWORD(2, 2);
int err = WSAStartup(wVersionRequested, &wsaData);

点击生成,Server端就可以启动了。
这些库的名称要以你自己安装的库为准,你需要去boost文件夹中查看这些库的准确名称。上面 {} 里面的安装目录也是这样。

4.2 生成 Thrift C++ Client
和 Server 的配置过程一样,只不过我们不用Hello_server.skeleton.cpp。我们需要自己编写客户端:

#include "Hello.h"
#include <thrift/transport/TSocket.h> 
#include <thrift/transport/TBufferTransports.h> 
#include <thrift/protocol/TBinaryProtocol.h> 
#include <iostream>
#include <string>using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;
using boost::shared_ptr;int main(int argc, char **argv) {boost::shared_ptr<TSocket> socket(new TSocket("localhost", 9090));boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket));boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));// 只需要实例化 HelloClient,然后就可以远程过程调用了Demo::HelloClient client(protocol);   transport->open();// Your Codes std::cout << client.helloInt(10030341) << std::endl;std::string tem = "hello from Client";client.helloString(tem, tem);std::cout << tem << std::endl;transport->close();return 0;
}

4.3 演示
4.3.1 Server

4.3.2 Client

二、nuget方式
配置nuget boost 库
点击右键:管理nuget程序包

Install-Package boost-vc140

(v1.62.0)

Install-Package openssl.v140.windesktop.msvcstl.dyn.rt-dyn

(OpenSSL 1.0.2d )

Install-Package libevent_vc120

(2.14 )

编译完成:

拷贝src,lib文件到项目

给出一个windows配置好的版本

里面包括vs2013,vs2015

thrift-master-0.9.3\lib\cppVS2013

thrift-master-0.9.3\lib\cppVS2015
————————————————
版权声明:本文为CSDN博主「冰_封」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xie1xiao1jun/article/details/53332504

相关文章:

CentOS 6.3 安装 samba 共享

PHP环境在linux下&#xff0c;但是开发的时候用的是windows&#xff0c;于是我用了samba将linux的一个目录共享&#xff0c;然后在windows上做映射&#xff0c;这样就可以直接在windows下编辑linux上的文件了 首先&#xff0c;安装samba软件&#xff0c;我采用的是yum安装&…

微信小程序 长按图片不出现菜单_微信更新,新功能上了热搜

微信在推出新功能方面相当克制&#xff0c;但每一次总能引起全网关注。昨天&#xff0c;微信又因为一个小功能的改进再次上了热搜&#xff0c;在安卓最新的 7.0.17 版本当中&#xff0c;微信取消了两分钟内删除功能。在新版微信中&#xff0c;发出的消息在两分钟内只有撤回功能…

windows下配置java环境jdk

Windows系统下搭建java的开发环境和配置环境变量 具体步骤打开链接地址&#xff1a;https://www.cnblogs.com/lijuntao/p/6694483.html转载于:https://www.cnblogs.com/ccw869476711/p/9401468.html

mysql 分区_搞懂MySQL分区

一.InnoDB逻辑存储结构首先要先介绍一下InnoDB逻辑存储结构和区的概念&#xff0c;它的所有数据都被逻辑地存放在表空间&#xff0c;表空间又由段&#xff0c;区&#xff0c;页组成。段段就是上图的segment区域&#xff0c;常见的段有数据段、索引段、回滚段等&#xff0c;在In…

apt Could not get lock /var/lib/dpkg/lock 解决方案

apt Could not get lock /var/lib/dpkg/lock 解决方案 删除锁定文件 sudo rm /var/lib/dpkg/lock

oracle创建DBLink连接

1.创建dblink的第一种方式&#xff0c;是在本地数据库tnsnames.ora文件中配置了要远程访问的数据库。tnsnames.ora文件在你安装oracle客户端安装文件里 如&#xff1a;(E:\oracle\product\10.2.0\db_1\NETWORK\ADMIN) 创建远程连接&#xff1a; INT (DESCRIPTION (ADDRES…

理解oracle中连接和会话

理解oracle中连接和会话1. 概念不同&#xff1a;概念不同&#xff1a; 连接是指物理的网络连接。 在已建立的连接上&#xff0c;建立客户端与oracle的会话&#xff0c;以后客户端与oracle的交互都在一个会话环境中进行。 2. 关系是多对多&#xff1a; 一个连接上可以建立0个…

ActiveMQ消息存储持久化

转https://www.cnblogs.com/xinhuaxuan/p/6128380.html https://blog.csdn.net/lr131425/article/details/68064914 为了避免意外宕机以后丢失信息&#xff0c;需要做到重启后可以恢复消息队列&#xff0c;消息系统一般都会采用持久化机制。 就是在发送者将消息发送出去后&…

python 非_Python函数的非固定参数

一、概述在原来的文章中我已经写了&#xff0c;位置参数和关键字参数&#xff0c;下面我们来谈谈默认参数和参数组二、默认参数默认参数指的是&#xff0c;我们在传参之前&#xff0c;先给参数制定一个默认的值。当我们调用函数时&#xff0c;默认参数是非必须传递的。默认参数…

C#关于面对象多态例子

//主的喂狗 class Program { static void Main(string[] args) { //我们来模拟一个主人养狗动物的例子 首先创建一个主人对象,同时主人买了条狗 //买来条狗&#xff0c;主人一喂&#xff0c;狗会吃东西 Person person ne…

ubuntu package XXX needs to be reinstalled,but I can't find an archive 问题修复

ubuntu package XXX needs to be reinstalled, but I can’t find an archive 修复 原文连接: https://blog.csdn.net/tbitwqb/article/details/78241101 内容&#xff1a; 不知道什么原因&#xff0c;可能是升级过程过关机或者其他什么情况导致当前问题的发生。 无论是apt…

CentOS6.2解决passwd: Authentication token manipulation error报错

passwd: Authentication token manipulation error这种错误可能有多种原因&#xff0c;就我了解的可能有/etc/passwd等文件i权限 今天在给学员上课的时候发现提示passwd: Authentication token manipulation error错误&#xff0c;我来简单描述今天的问题 [roothost4 Scripts]#…

Java核心技术第五章——2.Object类

Object类&#xff1a;所有类的超类 Object类是Java中所有类的始祖&#xff0c;在Java中每个类都是由它扩展而来的。但是并不需要这样写&#xff1a; public class Emloyee extends Object 如果没有明确的指出超类&#xff0c;Object就被认为是这个类的超类。在Java中&#xff0…

21day学通python_铁乐学python_day21_面向对象编程3

抽象类和接口类以下内容大部分摘自博客http://www.cnblogs.com/Eva-J/继承有两种用途&#xff1a;一&#xff1a;继承基类的方法&#xff0c;并且做出自己的改变或者扩展(代码重用)二&#xff1a;声明某个子类兼容于某基类&#xff0c;定义一个接口类Interface&#xff0c;接口…

系统crash无法启动 tpm error / could not read size 0x8000000e

系统crash无法启动 tpm error / couldn’t read size 0x8000000e 原文连接: https://unix.stackexchange.com/questions/305719/a-tpm-error-7-occurred-attempting-to-read-a-pcr-value-in-centos 内容&#xff1a; 问题&#xff1a; I’m getting this error while booting…

ASP.NET文件的下载

/// <summary>/// 下载文件/// </summary>/// <param name"filePath">文件的路径</param>/// <param name"fileName">文件名(有时候文件名存在数据库中用于替换路径中的文件名)</param>public void FileDownLoad(stri…

TestLink1.9.3测试用例:Excel转换XML工具一

最近在整理测试用例&#xff0c;所以想找一个合适的工具来完成对测试需求、测试用例的管理。对比了一翻&#xff0c;发现开源工具中扩展比较好的还属TestLink&#xff0c;而且还可以与JIRA进行对接&#xff0c;这样就引起了我更大的兴趣。加上之前本来就接触过此工具&#xff0…

MYSQL 使用自定义表变量

mysql 用户自定义表变量&#xff0c;ENGINEMyISAM DEFAULT CHARSETgb2312; 制定编码方式&#xff0c;防止乱码 DROP TABLE IF EXISTS p_temp; create temporary TABLE p_temp ( RowIndex int ,PRIMARY KEY (RowIndex))ENGINEMyISAM DEFAULT CHARSETgb2312; 转载于:https:/…

early EOF fatal: index-pack failed

early EOF fatal: index-pack failed 原文链接: https://stackoverflow.com/questions/21277806/fatal-early-eof-fatal-index-pack-failed 内容: First, turn off compression: git config --global core.compression 0 Next, let’s do a partial clone to truncate the a…

linux下运行python unitest_Python unittest打印日志可以在Linux上运行,但在Windows上不行...

我正在尝试编写一个unittest&#xff0c;它将stdout和stderr重定向到一个写在Windows网络驱动器上的文件。出于某些原因&#xff0c;相同的脚本(只有diff.是目录路径)可以在Linux上工作&#xff0c;但在Windows上不行。在Windows上运行时&#xff0c;不会将任何内容写入日志文件…

emacs 探索之五:latex配置

最近需要使用Latex写论文&#xff0c;之前一直在用emacs&#xff0c;而且渐渐理解emacs的思想之后发现大多数事情都能够在emacs中完成&#xff0c;那么自然会想到emacs是否能够与latex相结合。Google一下发现好多方式&#xff0c;当前前提是需要安装latex软件&#xff0c;然后e…

自动填充脚本使用及注意事项

网站开发需要&#xff0c;找了几个js脚本&#xff0c;最后选择了jQuery Autocomplete Mod&#xff08;http://www.pengoworks.com/workshop/jquery/autocomplete.htm&#xff09; 稍作修改&#xff0c;改动处见中文注释 1 jQuery.autocomplete function(input, options) {2 …

FFmpeg 与媒体文件关系

1. 容器/文件&#xff08;Container/File&#xff09;&#xff1a;即特定格式的多媒体文件&#xff0c;比如MP4&#xff0c;flv&#xff0c;mov等。 2. 媒体流&#xff08;Stream&#xff09;&#xff1a;表示在时间轴上的一段连续的数据&#xff0c;比如一段声音数据、一段视频…

一些可能没用过的调试窗口

首先说明&#xff1a;如果没有进入调试模式的话&#xff0c;默认的调试窗口如下&#xff1a; 开始前的准备&#xff1a; 新建控制台程序DebugWindowDemo&#xff1a; 修改Program.cs 的代码为&#xff1a; using System; using System.Threading; using System.Threading.Tasks…

linux 系统崩溃完全没有操作空间的系统修复

linux 系统崩溃完全没有操作空间的系统修复 1、通过U盘系统启动 2、修复文件系统 https://editor.csdn.net/md/?articleId106213788 此时硬盘会被挂在到U盘系统下作为一个目录, 例如/dev/sda2 修复它: fsck -y /dev/sda2很多时候都有效 3、修复grub

搜索进程内存地址_Linux编程 6 (查看进程 ps 及输出风格)

一&#xff0e;查看进程命令ps1.1 默认ps 命令在默认情况下&#xff0c;ps命令只会显示运行在当前控制台下&#xff0c;属于当前用户的进程&#xff0c;在上图中&#xff0c;我们只运行了bash shell以及ps命令本身。 上图中显示了程序的进程ID(1538,1583)&#xff0c;它们运行在…

关于最大子段和线性算法的证明

重复题目: 输入一个整形数组&#xff0c;数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组&#xff0c;每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。 此题最初载于 http://blog.csdn.net/v_JULY_v/article/details/6444021 我在文…

SQL Server使用侦听器IP访问时遇到The target principal name is incorrect. Cannot generate SSPI context...

SQL Server使用侦听器IP访问时遇到"The target principal name is incorrect. Cannot generate SSPI context" 原文:SQL Server使用侦听器IP访问时遇到"The target principal name is incorrect. Cannot generate SSPI context"在测试SQL Server 2016 Alwa…

linux+Qt 下利用D-Bus进行进程间高效通信的三种方式

linuxQt 下利用D-Bus进行进程间高效通信的三种方式 原文链接: https://www.cnblogs.com/wwang/archive/2010/10/27/1862552.html D-Bus概述 什么是D-Bus&#xff1f; D-Bus是一种进程间通信的机制&#xff0c;它被设计成为一种低开销、低延迟的IPC&#xff0c;并被多种桌面环…

xbmc-12.0稳定版代码初探 (2) —— XBMC_HOME

XBMC工程在debug时要设置XBMC_HOME的环境 用于指定ffmpeg的Dll文件位置&#xff0c;语言等等 xbmc/filesystem/SpecialProtocol.cpp 定义了一些如&#xff1a; CSpecialProtocol::SetXBMCPath();的函数 xbmc\Application.cpp InitDirectoriesWin32(); -> CUtil::GetHomePat…