学习thrift的一些总结
最近由于项目组买了面结构光传感器,自带一个软件,然而老师想我们自己做二次开发,然后就和技术聊了,他们的是基于thrift来做的,而thrift是个啥玩意,没办法,只能硬着头皮学了,这里记录一下学习中掉的坑。
thrift是个什么东西
Thrift是一种接口描述语言和二进制通讯协议,[1]它被用来定义和创建跨语言的服务。[2]它被当作一个远程过程调用(RPC)框架来使用,是由Facebook为“大规模跨语言服务开发”而开发的。它通过一个代码生成引擎联合了一个软件栈,来创建不同程度的、无缝的跨平台高效服务,可以使用C#、C++(基于POSIX兼容系统[3])、Cappuccino、[4]Cocoa、Delphi、Erlang、Go、Haskell、Java、Node.js、OCaml、Perl、PHP、Python、Ruby和Smalltalk。这里摘录维基百科的介绍。我理解就是可以使用一种语言写服务端,用另一种语言写客户端,客户端只需要知道服务端的接口就行了,至于服务端是使用什么语言,怎么实现的都不用在乎。
thrift安装
首先安装依赖
xingkp@xingkp-Vostro:~$ sudo apt-get install libboost-dev libboost-test-dev libboost-program-options-dev
libevent-dev automake libtool flex bison pkg-config g++ libssl-dev
然后从官网下载thrift安装包http://archive.apache.org/dist/thrift/,我使用的操作系统是ubuntu16.04,由于甲方提供的服务端在thrift-0.11.0版本下编译,因此我下载的是thrift-0.11.0版本的压缩包,下载完压缩包,解压到home目录下,然后执行
xingkp@xingkp-Vostro:~$ cd thrift-0.11.0/
然后安装编译
xingkp@xingkp-Vostro:~/thrift-0.11.0$ ./configure
xingkp@xingkp-Vostro:~/thrift-0.11.0$ sudo make
xingkp@xingkp-Vostro:~/thrift-0.11.0$ sudo make install
当我执行make,出现了一个错误,后来查了好久,原来是我电脑上装了qt4和qt5,导致了编译的时候程序没能正确链接到对应的qt版本,因此在执行第一步的时候改为
xingkp@xingkp-Vostro:~/thrift-0.11.0$ ./configure -with-qt5=no
这样在后续步骤才没出错
编译完成还需要添加环境变量,执行
xingkp@xingkp-Vostro:~$ sudo gedit ~/.bashrc
在打开的文件末尾添加export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:/usr/lib
如果安装成功,那么查看thrift版本应该是这样的
xingkp@xingkp-Vostro:~$ thrift -version
Thrift version 0.11.0
thrift默认安装在/usr/local/下面,查看/usr/local/lib文件夹应该有thrift相关的文件,这样就安装完成了。
thrift程序编译
如果是自己编写服务端,那应该首先创建一个thrift文件,然后生成cpp文件,再编写客户端,再编译,由于甲方已经编写好了服务端,这里直接对服务端进行编译。
首先进入gen-cpp文件夹
xingkp@xingkp-Vostro:~$ cd 3d_scan_thrift_test/gen-cpp/
xingkp@xingkp-Vostro:~/3d_scan_thrift_test/gen-cpp$
然后执行编译
xingkp@xingkp-Vostro:~/3d_scan_thrift_test/gen-cpp$ g++ -std=c++11 -DHAVE_NETINET_IN_H -g -I/usr/local/include/thrift
scan_3d.cpp techlego_meshwork_constants.cpp techlego_meshwork_types.cpp techlego_vtop_constants.cpp
techlego_vtop_types.cpp scan_3d_server.skeleton.cpp -o scan_3d -L/usr/local/lib -lthrift
生成可执行文件scan_3d(服务端)
编写客户端
xingkp@xingkp-Vostro:~/3d_scan_thrift_test/gen-cpp$ g++ -std=c++11 -g -Ithrift -L -lm -pthread -lz -lrt -lssl
scan_3d.cpp techlego_vtop_types.cpp techlego_vtop_constants.cpp client.cpp -o client -lthrift
编译完成后先执行服务端
xingkp@xingkp-Vostro:~/3d_scan_thrift_test/gen-cpp$ ./scan_3d
再执行客户端
xingkp@xingkp-Vostro:~/3d_scan_thrift_test/gen-cpp$ ./client
这里是调试用,实际上在windows下的面结构光采集软件可以集成了服务端,因此只需要编写客户端,即可