thrift:在cygwin下编译C library for win32(lib/c_glib)

如果要编译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命令行窗口执行下面的命令就可以完成所有依赖库及工具安装,如果安装过程中提示没有wgetlynx,请执行cygwin的setup-x86_64.exe安装。(apt-cyg需要调用wgetlynx来下载文件)

# 安装编译所需的工具的依赖库
# 注意这里的编译器是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

参考资料

《Windows Setup》

猜你喜欢

转载自blog.csdn.net/10km/article/details/80380998