如果要编译thrift的C++ 库,参照thrift官方的说明:Building thrift on Windows (Native)
使用cmake 编译还是比较方便的。(有空专门写一个thrift c++库的编译过程)
但是要在windows下编译thrift C library,用MSVC或MinGW都是无法编译的,也无法借助MSYS2环境编译。必须在cygwin下编译.原因就是lib/c_glib下的源码网络通讯部分调用的接口都是基于unix接口开发的,没有针对MSVC或MinGW编译器做适应性修改,所以代码中全部都是如下这样的include:
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
而MSVC,MinGW编译器都没有这些头文件,编译时自然无法通过。所以如果要编译thrift c library for win32必须在cygwin下执行。
下面以thrift 0.11.0版本为例说明在cygwin下编译C library(lib/c_glib)的过程。
安装cygwin
cygwin安装并不复杂,去官网(http://www.cygwin.com/)下载一个最新的版本,照着网上的教程一步步走下来就安装好了。
在给cygwin安装相关软件的过程中,发现cygwin提供的软件安装方式用起来比较麻烦,所以建议尽量用使用apt-cyg来做安装动作
关于安装cygwin和apt-cyg可以参考这篇文章 《Windows下安装Cygwin及apt-cyg》
文章中提供的apt-cyg的网址好像无法访问,可以访问github上的项目:
https://github.com/transcode-open/apt-cyg
apt-cyg其实就是一个脚本文件,apt-cyg这个项目git clone或zip下载到本地后,在cygwin中apt-cyg项目文件夹下执行install apt-cyg /bin
,就把apt-cyg这个文件复制到/bin
下,就算完成安装了。
安装依赖库
有了apt-cyg,安装依赖库和工具就方便多了,在cygwin命令行窗口执行下面的命令就可以完成所有依赖库及工具安装,如果安装过程中提示没有wget
或lynx
,请执行cygwin的setup-x86_64.exe
安装。(apt-cyg需要调用wget
或lynx
来下载文件)
# 安装编译所需的工具的依赖库
# 注意这里的编译器是gcc-g++,不是mingw64-x86_64-gcc-g++也不是mingw64-x86-gcc-g++,不能搞错
apt-cyg install gcc-g++ automake autoconf diffutils libtool bison flex openssl-devel libglib2.0-devel
# 如果编译C++ Library(lib/cpp)需要安装boost zlib,libevent
apt-cyg install libboost-devel zlib-devel libevent-devel
编译C library
编译过程如下:
./bootstrap.sh
# 生成Makefile
# 这里为了缩短编译时间,只编译c_glib库cpp,java,python库都指定不编译,并且不编译测试代码和tutorial
# CXXFLAGS中-D_GNU_SOURCE用于解决编译C++ library时报错的问题,如果不编译C++ library可以不加
./configure --enable-shared=no \
--enable-tests=no \
--enable-tutorial=no \
--with-c_glib=yes \
--with-cpp=no \
--with-python=no \
--with-java=no
--prefix=/you/install/path/
CXXFLAGS="-D_GNU_SOURCE -DPTHREAD_MUTEX_RECURSIVE_NP=PTHREAD_MUTEX_RECURSIVE"
# 编译并安装到--prefix指定的位置
# 为了加快编译速度,可以加-jX参数指定并行编译,如 make -j8 指定8线程并行编译
make install
开始编译时可能会报错:
make[4]: *** No rule to make target '/cygdrive/j/thrift-0.11.0/compiler/cpp/thrift', needed by 'gen-c_glib/t_test_container_test_types.c'. Stop.
我遇到了这个问题,就是Makfile在找不到compiler/cpp/thrift
,而compiler/cpp/thrift.exe
明明是存在的,一直没找到原因,所以我的解决办法就是不编译lib/c_glib/test,这就要修改lib/c_glib/Makefile.am
,
找到SUBDIRS = . test
这一行,替换为SUBDIRS = .
或替换为:
SUBDIRS = .
if WITH_TESTS
SUBDIRS += test
endif
意思就是当./configure
的命令行有--enable-tests=no
参数时,不编译test
文件夹。
改好后,重新执行上面的configure的命令,再make 就正常了。
如下是安装后的目录结构:
├── bin
│ └── thrift.exe
├── include
│ └── thrift
│ └── c_glib
│ ├── config.h
│ ├── processor
│ ├── protocol
│ ├── server
│ ├── thrift.h
│ ├── thrift_application_exception.h
│ ├── thrift_struct.h
│ └── transport
└── lib
├── libthrift_c_glib.a
├── libthrift_c_glib.la
└── pkgconfig
└── thrift_c_glib.pc
整个过程的完整编译脚本:https://gitee.com/l0km/faceapi/blob/master/faceapi-rpc-cpp/dependencies/cygwin_build_thrift.sh