thrift最初由facebook开发用做系统内各语言之间的RPC通信 ,可跨平台,我以前用的都是Winodw RPC,现在项目中用到了这个开源库,想着学习下,试着编译个静态库用用
先从https://thrift.apache.org/download下载最新版本,我下载的是thrift-0.11版本
vs2010打开thrift-0.11.0\lib\cpp下的thrift.sln,会有两个工程,libthrift提供基本RPC服务端功能,是阻塞模式,另一个是libthriftnb。提供高级服务端功能,比如异步支持,非阻塞模式,但是依赖libevent,我目前只用了前者,暂时只详细说下libthrift编译过程
前者虽然不依赖libevent,但是依赖boost和openssl,需要自己手动去下载带lib库的编译版本的
然后设置对应的include和lib如下图
然后编译,刚开始编译,一堆问题,只能耐着性子一个个看,最前面错误提示如下图
定位到代码如下图
我们看到有一个HAVE_INTTYPES_H宏包含来确定生效与否,我们再定位下这个宏
注释第40行代码然后编译,果然那个错误全部没了,但是出现下面这个问题
这个问题是由于max和实际系统的编译器界定问题,google了一下,原来是需要把max用括号括起来避免和windows定义的宏混淆(std::numeric_limits::max)()
因为Windef.h中定义了
#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
所以会产生编译错误
---------------------
作者:老衲不出家
来源:CSDN
原文:https://blog.csdn.net/tanningzhong/article/details/52890792
版权声明:本文为博主原创文章,转载请附上博文链接!
然后出现几个下面的错误
这个是因为config.h在thrift\windows目录下,而且包含目录已经设置了thrift\windows,所以这里只需要把thrift/config.h改成config.h即可,然后编译,又出现下面错误
其实这个宏定义是在config.h文件的,不是叫PACKAGE_VERSION,而是VERSION,改成VERSION,然后编译出现下面的错误
编译到这里,基本所有的错误都集中在TNonblockingServer.h文件,明显这个应该是libthriftnb项目中需要的文件,不知道为啥出现在我们的libthrift项目中了,详细看了下,我也没包含这个文件呀,然后我就去看了下libthrift.vcxproj文件的内容
发现这个里面多了一条记录,奇了怪了哈,官网下载的源码,还能出现这种纰漏,恩,现在删除这条记录,然后编译,就成功了
如果想编译libthriftnb,估计和这个流程类似,多个libevent的包含设置吧,大家自行琢磨了