请问有没有人在windows下,用VS2010成功运行过thrift的程序?

xxMix 2012-09-04 02:04:56
我目前使用的thrift版本是0.8.0。我整理一下我的步骤:

1.从boost pro下载安装boost库,包括源文件和lib库。

2.从libevent官网下载libevent库,只有源文件。

3.从thrift官网,使用svn方式下载thrift库,只有源文件。(千万别用压缩包版本的Release发布包,里面的路径都不对)

4.在thrift库的cpp文件夹里,有libthrift和libthriftnb两个工程,这两个工程都可以直接使用VS2010打开。
其中,libthrift需要链接boost的源文件,引用boost lib库。
而libthriftnb不仅仅需要boost的源文件和boost lib库,还需要引用libevent源文件。
然后就可以编译libthrift和libthriftnb两个工程。

5.在thrift的svn的tutorial目录下,用thrift-0.8.0.exe编译tutorial.thrift和shared.thrift,会得到一堆cpp和h文件。这时,新建一个C++ Console空工程,把这些文件都引入。
期间还需要做一些小修正:
5.1 删除thrift文件里的D语言(因为没有这语言的编译器)
5.2 删除shared的skeleton.cpp(防止与Calculator的skeleton.cpp的main冲突)
5.3 为CalculatorHandler类增加一个getStruct函数实现(防止VS2010报错说不能实例化虚类,getStruct方法的内容为空,返回值和参数,直接复制SharedServiceIf.h里的)

到这里,语言上的错误基本上没有了。但是会报以下几个错误:
---------------------------------------------------------------------------------------

错误 11 error LNK2019: 无法解析的外部符号 "public: unsigned int __thiscall apache::thrift::TApplicationException::read(class apache::thrift::protocol::TProtocol *)" (?read@TApplicationException@thrift@apache@@QAEIPAVTProtocol@protocol@23@@Z),该符号在函数 "public: void __thiscall tutorial::CalculatorClient::recv_ping(void)" (?recv_ping@CalculatorClient@tutorial@@QAEXXZ) 中被引用 目录\ThriftTest3-ApacheDemo\Calculator.obj ThriftTest3-ApacheDemo
错误 12 error LNK2001: 无法解析的外部符号 "public: unsigned int __thiscall apache::thrift::TApplicationException::read(class apache::thrift::protocol::TProtocol *)" (?read@TApplicationException@thrift@apache@@QAEIPAVTProtocol@protocol@23@@Z) 目录\ThriftTest3-ApacheDemo\SharedService.obj ThriftTest3-ApacheDemo
错误 13 error LNK2019: 无法解析的外部符号 "public: unsigned int __thiscall apache::thrift::TApplicationException::write(class apache::thrift::protocol::TProtocol *)const " (?write@TApplicationException@thrift@apache@@QBEIPAVTProtocol@protocol@23@@Z),该符号在函数 "public: virtual bool __thiscall tutorial::CalculatorProcessor::process(class boost::shared_ptr<class apache::thrift::protocol::TProtocol>,class boost::shared_ptr<class apache::thrift::protocol::TProtocol>,void *)" (?process@CalculatorProcessor@tutorial@@UAE_NV?$shared_ptr@VTProtocol@protocol@thrift@apache@@@boost@@0PAX@Z) 中被引用 目录\ThriftTest3-ApacheDemo\Calculator.obj ThriftTest3-ApacheDemo
错误 14 error LNK2001: 无法解析的外部符号 "public: unsigned int __thiscall apache::thrift::TApplicationException::write(class apache::thrift::protocol::TProtocol *)const " (?write@TApplicationException@thrift@apache@@QBEIPAVTProtocol@protocol@23@@Z) 目录\ThriftTest3-ApacheDemo\SharedService.obj ThriftTest3-ApacheDemo
错误 15 error LNK2019: 无法解析的外部符号 "public: virtual void __thiscall apache::thrift::server::TSimpleServer::serve(void)" (?serve@TSimpleServer@server@thrift@apache@@UAEXXZ),该符号在函数 _main 中被引用 目录\ThriftTest3-ApacheDemo\Calculator_server.skeleton.obj ThriftTest3-ApacheDemo
错误 16 error LNK2019: 无法解析的外部符号 "public: __thiscall apache::thrift::transport::TServerSocket::TServerSocket(int)" (??0TServerSocket@transport@thrift@apache@@QAE@H@Z),该符号在函数 _main 中被引用 目录\ThriftTest3-ApacheDemo\Calculator_server.skeleton.obj ThriftTest3-ApacheDemo
错误 17 error LNK2001: 无法解析的外部符号 "public: virtual void __thiscall apache::thrift::transport::TBufferedTransport::flush(void)" (?flush@TBufferedTransport@transport@thrift@apache@@UAEXXZ) 目录\ThriftTest3-ApacheDemo\Calculator_server.skeleton.obj ThriftTest3-ApacheDemo
错误 18 error LNK2001: 无法解析的外部符号 "public: virtual unsigned int __thiscall apache::thrift::transport::TBufferedTransport::readSlow(unsigned char *,unsigned int)" (?readSlow@TBufferedTransport@transport@thrift@apache@@UAEIPAEI@Z) 目录\ThriftTest3-ApacheDemo\Calculator_server.skeleton.obj ThriftTest3-ApacheDemo
错误 19 error LNK2001: 无法解析的外部符号 "public: virtual void __thiscall apache::thrift::transport::TBufferedTransport::writeSlow(unsigned char const *,unsigned int)" (?writeSlow@TBufferedTransport@transport@thrift@apache@@UAEXPBEI@Z) 目录\ThriftTest3-ApacheDemo\Calculator_server.skeleton.obj ThriftTest3-ApacheDemo
错误 20 error LNK2001: 无法解析的外部符号 "public: virtual unsigned char const * __thiscall apache::thrift::transport::TBufferedTransport::borrowSlow(unsigned char *,unsigned int *)" (?borrowSlow@TBufferedTransport@transport@thrift@apache@@UAEPBEPAEPAI@Z) 目录\ThriftTest3-ApacheDemo\Calculator_server.skeleton.obj ThriftTest3-ApacheDemo
错误 21 error LNK1120: 8 个无法解析的外部命令 目录\Debug\ThriftTest3-ApacheDemo.exe ThriftTest3-ApacheDemo
(其中“目录”只是我的工程的路径,为了节省空间,略去了)


我觉得,问题应该出在第5步,也就是用thrift-0.8.0.exe编译tutorial.thrift和shared.thrift以及建立工程的这一步。我觉得,svn里的tutorial.thrift和shared.thrift这个例子,有些复杂。因此,我在thrift官网首页的Example栏目里,看到一个更简单的例子,然后保存为thrift文件,再次用thrift-0.8.0.exe编译,建立工程,引入cpp和h文件,编译,结果还是那些错误。

最后,我自己写了个更简单的例子,结果还是那堆错误。

请问,问题出在哪里?有没有朋友在VS2010下成功运行过thrift程序的?能否给点建议?谢谢~
...全文
1076 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sinper9527 2013-12-17
  • 打赏
  • 举报
回复
楼主,你是将HadoopThriftServer.class中的UTF-8改成Unicode从而解决string中乱码的问题的么?
hugett 2013-06-13
  • 打赏
  • 举报
回复
赵4老师 2013-06-13
  • 打赏
  • 举报
回复
项目、属性、C/C++、附加包含目录:填写附加头文件所在目录 分号间隔多项 项目、属性、链接器、常规、附加库目录:填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项:填写附加依赖库的名字.lib 空格或分号间隔多项
xxMix 2013-06-13
  • 打赏
  • 举报
回复
很多朋友私信我联系方式,这里给一个thrift的群号 QQ群 23152359 ,里面有很多玩thrift的大神。
cjchanjian 2013-04-15
  • 打赏
  • 举报
回复
楼主能不能留个QQ,请教一下thrift的问题
iunknown1 2013-02-20
  • 打赏
  • 举报
回复
进群看看,最近也在研究,python比较好搞,C++太麻烦了
charlesyao0426 2013-02-19
  • 打赏
  • 举报
回复
兄弟们,交流的群号能共享不? 最近项目上要用到,谢谢先!
xxMix 2013-01-22
  • 打赏
  • 举报
回复
引用 7 楼 dongfangbuba 的回复:
兄弟,尝试过Server端主动发送么?
thrift没有这个功能。 thrift是rpc结构。rpc结构默认是 客户端请求 -> 服务端回应 -> 连接断开 的这种短连接形式,因此rpc默认是没有服务端回调功能,也没有长连接。 虽然按照这种规范,rpc只能由客户端向服务端发起一次性的短连接服务请求,不过,一些高级rpc还是支持双向和长连接,但也要客户端先访问服务端,然后服务端才能回调客户端,比如wcf。
dongfangbuba 2013-01-17
  • 打赏
  • 举报
回复
兄弟,尝试过Server端主动发送么?
newtee 2012-12-07
  • 打赏
  • 举报
回复
newtee 2012-12-07
  • 打赏
  • 举报
回复
xxMix 2012-12-07
  • 打赏
  • 举报
回复
到今天为止,在大牛的指导下,终于把thrift玩通了。 Thrift的C++版本,在win下编译很麻烦。过程: 1.svn下载thrift。你首先要学习,什么是svn(svn类似ftp)。接着,要去找svn客户端(类似FlashFXP )。 2.下载完成后,在目录里找到 thrift\lib\cpp,里面有两个VS工程,一个是libthrift,提供基本服务端功能,另一个是libthriftnb。提供高级服务端功能,比如异步支持。 3.当前版本0.9.0,但任然需要修改thrift里的部分代码,才能让它在win里运行。具体代码包请加群193713524,里面有几个大牛有已经改好的,工作日在群里多找几个时间问一下。当然,自己改也行,但需要找很多个帖子,不断尝试才行,因为有些帖子给出的修改方案并不可取。 4.接下来,需要使用thrift的依赖库。有两个,boost和libevent。这两个依赖库有很多版本,具体需要哪个版本,在thrift和thriftnb工程->属性->VC++目录->包含目录 里可以看到。由于boost库编译后的lib,我死活用不了,而且libevent不需要编译,只需要进行include就行。因此,我的建议是,只下载 boost和libevent,在编译时,会提示缺少 boost的lib,然后直接在网上下载编译好的 boost lib,有好几个。 5.把这两个库加入到thrift和thriftnb工程里后,就可以进行编译了。要注意的是,你打开vs后,应该只有一个解决方案,这个解决方案里,有两个项目,一个是thrift,另一个是thriftnb。编译时,要对解决方案进行生成,而不是对项目进行生成。如果只对项目进行生成,则可能会造成生成第二个项目时,会把第一个项目产生的lib给删掉。另一个,thrift有4个版本,win32_debug,win32_debug_mt,x64_release,x64_release_mt,我建议都编译。最后编译出来,要用的是lib库,和用于调试的pdb文件,release版本是没有也不需要pdb的,只有debug版本才需要pdb. 6.接着谈别的语言。由于目前0.9.0并不是正式版本,所以thrift文档里提到的功能,并不是每一个语言都支持,实际情况是,每一种语言支持的协议和服务端模式都少得可怜。而且有些功能还有bug,比如C++的thrift的保存为文件功能,就有bug。不过通信功能还是没有问题的。 7.最后需要注意一个地方就是,thrift的string是utf-8的。对于java或c#这种语言,当然不是问题,但c++处理utf-8是有点麻烦的,做过的朋友不怕,没做过的,可能需要去专门补上几课:编码是什么?如何用vc++处理ansi/宽字符/Unicode/utf-8/utf-16/gbk,以及之间的互相转换等等,非常麻烦。 8.上面罗嗦了一堆,其实一句话可以解决上面所有问题,就是直接在工作日,在那个群里,多吼几次,跪求高手的已经搞好的现成的库、包以及示范工程,这样就可以节约非常多的时间。同时也感谢那个群里热心的大牛们,帮我搞通了这些问题。
dongfangbuba 2012-12-06
  • 打赏
  • 举报
回复
兄弟,留一个联系方式行么?我最近也在研究这个框架,项目上需要。想请教几个问题

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧