cygwin的配置就不多说了,缺什么就通过安装器安装好了。

在thrift的官网下载 thrift-0.11.0源码,通过cmake编译,生成Makefile之后,make出现编译错误

/cygdrive/d/work/thrift-0.11./mybuild $ make

[ %] Building CXX object compiler/cpp/CMakeFiles/parse.dir/thrift/thrifty.cc.o
/cygdrive/d/work/thrift-0.11./compiler/cpp/src/thrift/thrifty.yy: 在函数‘int yyparse()’中:
/cygdrive/d/work/thrift-0.11./compiler/cpp/src/thrift/thrifty.yy::: 错误:‘strdup’在此作用域中尚未声明
$$ = strdup("");
^~~~
/cygdrive/d/work/thrift-0.11./compiler/cpp/src/thrift/thrifty.yy::: 附注:suggested alternative: ‘strcmp’
$$ = strdup("");
^~~~
strcmp
make[]: *** [compiler/cpp/CMakeFiles/parse.dir/build.make::compiler/cpp/CMakeFiles/parse.dir/thrift/thrifty.cc.o] 错误
make[]: *** [CMakeFiles/Makefile2::compiler/cpp/CMakeFiles/parse.dir/all] 错误
make: *** [Makefile::all] 错误

查看cmake生成Makefile的日志,在某个cmake文件里设置了-std=c++11,找到:

D:\work\thrift-0.11.0\build\cmake\DefineCMakeDefaults.cmake (2 hits)
Line 79: message(STATUS "Setting C++98 as the default language level (for an older MSVC compiler).")
Line 82: message(STATUS "Setting C++11 as the default language level.")

如下修改:

if (NOT DEFINED CMAKE_CXX_STANDARD)
if (MSVC AND MSVC_VERSION LESS )
# MSVC and earlier don't support template aliases so you have to use C++98
set(CMAKE_CXX_STANDARD )
message(STATUS "Setting C++98 as the default language level (for an older MSVC compiler).")
else()
#set(CMAKE_CXX_STANDARD ) # C++
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
message(STATUS "Setting C++11 as the default language level.")
endif()
message(STATUS "To specify a different C++ language level, set CMAKE_CXX_STANDARD")
endif()

继续编译,随即遇到编译错误:

[ %] Building CXX object lib/cpp/CMakeFiles/thrift_static.dir/src/thrift/transport/THttpServer.cpp.o
/cygdrive/d/work/thrift-0.11./lib/cpp/src/thrift/transport/THttpServer.cpp: 在成员函数‘virtual void apache::thrift::transport::THttpServer::parseHeader(char*)’中:
/cygdrive/d/work/thrift-0.11./lib/cpp/src/thrift/transport/THttpServer.cpp::: 错误:‘strcasestr’在此作用域中尚未声明
#define THRIFT_strcasestr(haystack, needle) strcasestr(haystack, needle)
^
/cygdrive/d/work/thrift-0.11./lib/cpp/src/thrift/transport/THttpServer.cpp::: 附注:in expansion of macro ‘THRIFT_strcasestr’
if (THRIFT_strcasestr(value, "chunked") != NULL) {
^~~~~~~~~~~~~~~~~
/cygdrive/d/work/thrift-0.11./lib/cpp/src/thrift/transport/THttpServer.cpp::: 附注:suggested alternative: ‘strcasecmp’
#define THRIFT_strcasestr(haystack, needle) strcasestr(haystack, needle)
^
/cygdrive/d/work/thrift-0.11./lib/cpp/src/thrift/transport/THttpServer.cpp::: 附注:in expansion of macro ‘THRIFT_strcasestr’
if (THRIFT_strcasestr(value, "chunked") != NULL) {
^~~~~~~~~~~~~~~~~
make[]: *** [lib/cpp/CMakeFiles/thrift_static.dir/build.make::lib/cpp/CMakeFiles/thrift_static.dir/src/thrift/transport/THttpServer.cpp.o] 错误
make[]: *** [CMakeFiles/Makefile2::lib/cpp/CMakeFiles/thrift_static.dir/all] 错误
make: *** [Makefile::all] 错误

这里我就直接修改源代码了:

#define _GNU_SOURCE
#include <string.h>

将这两行放在thrift-0.11.0/lib/cpp/src/thrift/transport/THttpServer.cpp的其他include头文件的前面,不然 #define _GNU_SOURCE 会被编译器忽略

随即又遇到编译错误:

/cygdrive/d/work/thrift-0.11./lib/cpp/src/thrift/concurrency/Mutex.cpp: 在静态成员函数‘static void apache::thrift::concurrency::Mutex::RECURSIVE_INITIALIZER(void*)’中:
/cygdrive/d/work/thrift-0.11./lib/cpp/src/thrift/concurrency/Mutex.cpp::: 错误:‘PTHREAD_MUTEX_RECURSIVE_NP’在此作用域中尚未声明
init_with_kind((pthread_mutex_t*)arg, PTHREAD_MUTEX_RECURSIVE_NP);
^~~~~~~~~~~~~~~~~~~~~~~~~~
/cygdrive/d/work/thrift-0.11./lib/cpp/src/thrift/concurrency/Mutex.cpp::: 附注:suggested alternative: ‘PTHREAD_MUTEX_RECURSIVE’
init_with_kind((pthread_mutex_t*)arg, PTHREAD_MUTEX_RECURSIVE_NP);
^~~~~~~~~~~~~~~~~~~~~~~~~~
PTHREAD_MUTEX_RECURSIVE
make[]: *** [lib/cpp/CMakeFiles/thrift_static.dir/build.make::lib/cpp/CMakeFiles/thrift_static.dir/src/thrift/concurrency/Mutex.cpp.o] 错误
make[]: *** [CMakeFiles/Makefile2:
这里又是cygwin的库问题了,不支持PTHREAD_MUTEX_RECURSIVE_NP,改成 PTHREAD_MUTEX_RECURSIVE
#ifdef PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
void Mutex::RECURSIVE_INITIALIZER(void* arg) {
//init_with_kind((pthread_mutex_t*)arg, PTHREAD_MUTEX_RECURSIVE_NP);
init_with_kind((pthread_mutex_t*)arg, PTHREAD_MUTEX_RECURSIVE);
}
#endif

链接单元测试时又出现库不兼容的问题。。。

CMakeFiles/UnitTests.dir/concurrency/MutexTest.cpp.o:MutexTest.cpp:(.rdata$.refptr._ZN6apache6thrift11concurrency5Mutex20ADAPTIVE_INITIALIZEREPv[.refptr._ZN6apache6thrift11concurrency5Mutex20ADAPTIVE_INITIALIZEREPv]+0x0):对‘apache::thrift::concurrency::Mutex::ADAPTIVE_INITIALIZER(void*)’未定义的引用
collect2: 错误:ld 返回
make[]: *** [lib/cpp/test/CMakeFiles/UnitTests.dir/build.make::bin/UnitTests.exe] 错误
make[]: *** [CMakeFiles/Makefile2::lib/cpp/test/CMakeFiles/UnitTests.dir/all] 错误
make: *** [Makefile::all] 错误

自适应锁在cygwin的最新版是没有的,就给它弄个默认的,该咋死咋死吧:

#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
void Mutex::ADAPTIVE_INITIALIZER(void* arg) {
// From mysql source: mysys/my_thr_init.c
// Set mutex type to "fast" a.k.a "adaptive"
//
// In this case the thread may steal the mutex from some other thread
// that is waiting for the same mutex. This will save us some
// context switches but may cause a thread to 'starve forever' while
// waiting for the mutex (not likely if the code within the mutex is
// short).
init_with_kind((pthread_mutex_t*)arg, PTHREAD_MUTEX_ADAPTIVE_NP);
}
#else
void Mutex::ADAPTIVE_INITIALIZER(void* arg) {
// From mysql source: mysys/my_thr_init.c
// Set mutex type to "fast" a.k.a "adaptive"
//
// In this case the thread may steal the mutex from some other thread
// that is waiting for the same mutex. This will save us some
// context switches but may cause a thread to 'starve forever' while
// waiting for the mutex (not likely if the code within the mutex is
// short).
init_with_kind((pthread_mutex_t*)arg, PTHREAD_MUTEX_NORMAL);
}
#endif

OK,至此,完美编译成功!

cygwin上编译RPC框架thrift的更多相关文章

  1. RPC框架Thrift例子-PHP调用C++后端程序

    更新 2016-02-22: Response对象不用主动创建. 前言 前段时间用了一下Facebook的开源RPC框架Thrift,做PHP客户端调用C++后端程序,真心觉得Thrift不错! 本文 ...

  2. rpc框架: thrift/avro/protobuf 之maven插件生成java类

    thrift.avro.probobuf 这几个rpc框架的基本思想都差不多,先定义IDL文件,然后由各自的编译器(或maven插件)生成目标语言的源代码,但是,根据idl生成源代码这件事,如果每次都 ...

  3. .Net RPC框架Thrift的用法

      关于Thrift 下面是来自百度百科关于Thrift的介绍: thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和引擎,以构建在 C++, Java, Go ...

  4. rpc框架thrift

    跨语言的rpc框架 新建一个thrift文件 # ping service demoservice PingService { string ping(), ping函数的返回类型是字符串} serv ...

  5. [development][thrift] RPC框架 thrift

    一: wiki:https://zh.wikipedia.org/wiki/Thrift 二: 来自IBM的介绍:https://www.ibm.com/developerworks/cn/java/ ...

  6. RPC框架 - thrift 客户端

    -------客户端程序 ------ 下载    下载 thrift 源代码包    下载 thrift 的bin包 准备描述文件(使用源代码包的示例文件)    \thrift-0.10.0\tu ...

  7. RPC框架 - thrift 服务端

    -------服务端程序 ------ 下载    下载 thrift 源代码包    下载 thrift 的bin包 准备描述文件(使用源代码包的示例文件)    \thrift-0.10.0\tu ...

  8. [源码解析] PyTorch 分布式(17) --- 结合DDP和分布式 RPC 框架

    [源码解析] PyTorch 分布式(17) --- 结合DDP和分布式 RPC 框架 目录 [源码解析] PyTorch 分布式(17) --- 结合DDP和分布式 RPC 框架 0x00 摘要 0 ...

  9. rpc框架之 thrift 学习 1 - 安装 及 hello world

    thrift是一个facebook开源的高效RPC框架,其主要特点是跨语言及二进制高效传输(当然,除了二进制,也支持json等常用序列化机制),官网地址:http://thrift.apache.or ...

随机推荐

  1. ROUND()和TRUNC()函数

    ROUND(number[,decimals]) 其中:number 待做截取处理的数值: decimals 指明需保留小数点后面的位数,可选项.需要注意的是,和trunc函数不同,对截取的数字要四舍 ...

  2. WKWebView简单使用及关于缓存的问题

    Xcode8发布以后,编译器开始不支持IOS7,所以很多应用在适配IOS10之后都不在适配IOS7了,其中包括了很多大公司,网易新闻,滴滴出行等.因此,我们公司的应用也打算淘汰IOS7.支持到IOS8 ...

  3. NEC html规范

    HTML规范 - 整体结构 HTML基础设施 文件应以“<!DOCTYPE ......>”首行顶格开始,推荐使用“<!DOCTYPE html>”. 必须申明文档的编码cha ...

  4. Java程序如何生成Jar 执行文件(2)

    一.用Eclipse生产Jar文件 注意:此方法可以打包含有第三方jar包的项目 1. 首先,右键你的Java工程,选择Export,在Java文件夹下选择Runnable JAR file,如下图所 ...

  5. ABAP术语-ALE

    ALE 原文:http://www.cnblogs.com/qiangsheng/archive/2007/12/13/993351.html Application Link Enabling (A ...

  6. 使用nginx对spring boot项目进行代理

    摘要:使用nginx对spring boot项目进行反向代理,并且使用轮询均衡负载策略 均衡负载与集群 集群和均衡都涉及到多个机器提供的服务的问题 不同点是,集群是互相通信.协同的的多个服务,服务之前 ...

  7. Co. - Apple - MacBook Pro 快捷键

    Mac 键盘快捷键:https://support.apple.com/zh-cn/HT201236 从windows转到mac的童鞋,可能删除键是心中的一个痛,以前习惯一按delete什么都消失,其 ...

  8. 第一次使用Git上传本地项目到github

    看了好多帖子,终于在混乱中找到自己适合的方法......自我感觉这个比较简单. 先安装本地git,官方下载地址:http://git-scm.com/download/  根据你自己的系统 下载对应版 ...

  9. 初识python 面向对象

    what the f**k!!这个知识点学不好的最大元凶就是,我还单身??? python基础(四): 面向对象的三个特点: 封装,继承,多态 类: 对象是面向对象编程的核心,在使用对象的过程中,为了 ...

  10. (数据科学学习手札23)决策树分类原理详解&Python与R实现

    作为机器学习中可解释性非常好的一种算法,决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方 ...