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. 如何配置Java环境变量

    百度经验 | 百度知道 | 百度首页 | 登录 | 注册 新闻 网页 贴吧 知道 经验 音乐 图片 视频 地图 百科 文库 帮助   发布经验 首页 分类 任务 回享 商城 特色 知道 百度经验 &g ...

  2. MySQL数据库主从(主主)配置

    一.系统环境: centos7.4 (centos 1708) mysql 5.7 master主机的IP地址为192.168.159.50 slave主机的IP地址为192.168.159.51 M ...

  3. 关于Vue-cli 跨域,即使是非自己的服务器也可以get到内容

    刚入门vue ,打算用vue的脚手架做一个小项目.需要用到第三方的api,无奈遇到各种各样的问题. 比如 Access-Control-Allow-Origin ,或者使用了ajax的jsonp模式之 ...

  4. Flask中对MySQL的基本操作

    在Flask-SQLAlchemy中,插入.修改.删除操作,均由数据库会话管理. 会话用 db.session 表示.在准备把数据写入数据库前,要先将数据添加到会话中然后调用 commit() 方法提 ...

  5. MySQL传输表空间使用方法

    1.目标端创建同样的表结构 CREATE TABLE `test` (       `id` int(11) DEFAULT NULL     ) ENGINE=InnoDB DEFAULT CHAR ...

  6. 树莓派官方推荐的VNC Viewer配置详解Raspberry Pi3 B+

    1GB内存,16GB硬盘容量.这是我目前使用的Pi3树莓派. SVN Viewer远程连接,台式机192.168.1.102连接局域网192.168.1.110上的树莓派.使用的软件是: https: ...

  7. python核心编程2 第九章 练习

    9–1. 文件过滤. 显示一个文件的所有行, 忽略以井号( # )开头的行. 这个字符被用做Python , Perl, Tcl, 等大多脚本文件的注释符号.附加题: 处理不是第一个字符开头的注释. ...

  8. centos7中vsftp的搭建

    开启vsftpd:service vsftpd start关闭vsftp:service vsftpd stop 安装vsftpd: yum -y install vsftpd 建立vsftpd帐号: ...

  9. 【vlan-给予mac地址认证】

    根据项目需求搭建好如下的路由和交换拓扑图: 1:用pc1  ping pc2 使交换机捕捉到4台pc及的 mac地址 查看交换机学习到的mac地址情况 2:配置交换机和pc机之间的接口,根pc机的ma ...

  10. php-5.6.26源代码 - include_once、require_once、include、require、eval 的opcode处理器

    # ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER 实现在文件 php-\Zend\zend_vm_execute.h static int ZEND_FASTCALL ...