thrift for lua 使用记录

本人精心总结,欢迎转载,转载请注明出处:http://blog.csdn.net/einsteinlike/article/details/43700985

thrift是一个十分节省的数据传输协议,我们尝试将其移植到quick-cocos2dx上面:

lua的使用:首先编译lua5.2 make install进系统。然后编译thrift 0.9.2 ,配置的时候选择 ./configure —with-lua —with-c++等

然后make的时候各种有错,没关系,只要到make lua结束后就可以忽略后面的错误,直接make install ,因为后面的错误是test的错误。

然后使用thrift , thrift -gen lua xxx.thrifts。来生成目标语言的接口代码,这里生成lua的代码。

然后找到test里面的lua 客户端与服务器test,将lib下的lua文件都拷贝过来,里面有一些修改,比如require ‘xxxx‘之前加入 libxxx=require ‘xxxx’,这样方便函数调用:libxxx:func.

make  lib目录下的src里的那些.c文件,之后会出现4个.la ,luabitwise , luabpack , lualongnumber,luasocket .但是经过查询la文件只是个说明文件,没有用,lib下的那些lua文件又require了他们,所以他们必须是动态库.so文件。

所以我用xcode+gcc编译了这4个.so,首先建立xcode项目:MACOSX 的 bundle。然后放入那些.c,有的需要两个.c才能编译成功,这期间的错误只能经过他本身的修改源代码来解决。

Xcode build success后,我们不需要bundle文件,所以我们找到bundle文件的目录,在其上级目录下的某个目录中找到我们需要的.o文件(这里最好不一次性编译好4个bundle,而是一个一个的编译好,然后就去找对应的.o,因为其中有一个longnumber.c被两个动态库都用到了,所以一个一个的编译可以避免冲突 )

拷贝出.o,用下面提到的命令行编译出.so,供lua调用,调用期间出现的各种错误需要通过修改.c的源代码解决。

编译过程中的一些错误与修改:

make thrift 出错:

t_test_second_service.o

gen-c_glib/t_test_second_service.c:488:3:error:non-void function ‘t_test_second_service_handler_blah_blah‘
should return a value [-Wreturn-type]

g_return_if_fail (T_TEST_IS_SECOND_SERVICE_HANDLER (iface));

  ^

/usr/local/include/glib-2.0/glib/gmessages.h:373:3: note:expanded from macro ‘g_return_if_fail‘
,这里我都替换成了return 0;

return;                                                        \

         ^

gen-c_glib/t_test_second_service.c:495:3:error:non-void function ‘t_test_second_service_handler_secondtest_string‘
should return a value

[-Wreturn-type]

g_return_if_fail (T_TEST_IS_SECOND_SERVICE_HANDLER (iface));

  ^

/usr/local/include/glib-2.0/glib/gmessages.h:373:3: note: expanded from macro ‘g_return_if_fail‘

return;

编译boost出错,或者找不到boost:修改如下目录为本地该有的目录

BOOST_CPPFLAGS = -I/usr/local/include/boost-0

找不到以下函数,都替换为TLSv1_method()

else if(protocol == TLSv1_1)

{

ctx_ = SSL_CTX_new(TLSv1_1_method());

}

else if(protocol == TLSv1_2)

{

ctx_ = SSL_CTX_new(TLSv1_2_method());

}

编译lua用的.so动态库的命令行:

gcc -O2 -bundle -undefined dynamic_lookup -omylualib.so src/libluabpack_la-luabpack.o  lua能够识别的库

liujiandeMini:lua liujian$ gcc -O2 -bundle -undefined dynamic_lookup -olibluabpack.so src/luabpack.o src/longnumberutils.o

liujiandeMini:lua liujian$ gcc -O2 -bundle -undefined dynamic_lookup -o libluabitwise.so src/luabitwise.o

liujiandeMini:lua liujian$ gcc -O2 -bundle -undefined dynamic_lookup -o libluasocket.so src/luasocket.o src/usocket.o

liujiandeMini:lua liujian$ gcc -O2 -bundle -undefined dynamic_lookup -o liblualongnumber.so src/lualongnumber.o src/longnumberutils.o

liujiandeMini:lua liujian$ gcc -O2 -bundle -undefined dynamic_lookup -olibluabitwise.so src/luabitwise.o

//这是尝试,lua那些库的写法,以下才是正确的

#include<lua.h>

#include<lauxlib.h>

#include<stdio.h>

staticintl_see(lua_State*L)

{

printf("asdasdasd\n");

return1;

}

staticconststructluaL_Regfuncs[]
= {

{"see",l_see},

{NULL,NULL}

};

intluaopen_uuu(lua_State*L)
{

如果用funcs做参数传递下面的函数,会出现   Bus error 10,是内存对齐出错,所以改用了funcs->func

luaL_requiref(L,"uuu",funcs->func,0);这句会执行这些func

所以使用 luaL_newlib(L,funcs);
替换

return1;

}

size_t len =
lua_objlen(L,
2);//lua_rawlen 5.1.5没有rawlen

lua 客户端调用逻辑,发送、接收

client:send_put(s);

local ss= client:recv_put(s);

print(ss);

http://blog.csdn.net/hard_man/article/details/8507770 lua5.2调用c函数成功的例子

http://www.jb51.net/article/55480.htm Lua教程(六):绑定一个简单的C++类

http://www.cnblogs.com/masky5310/archive/2011/04/06/2006776.htmlLua
5.1 参考手册

http://blog.chinaunix.net/uid-16175292-id-3473543.html和我一起写lua
- Mac OS X环境编译C模块
 ,我用的xcode编译出.o,因为单独编译源文件提示找不到lua.h,我又不会配置gcc,所以就用xcode配置好链接库与头文件,创建为bundle工程,build
success 之后找到生成的bundle,然后去上级目录下查找,某个文件夹下有.o文件,拷贝出来自用,再用gcc连接出.so。所以macosx不止有dylib,也能编出有.so,并运行

http://blog.csdn.net/rheostat/article/details/18796911Lua C module 注意事项UA multiple
Lua VMs detected

http://www.th7.cn/Program/IOS/201412/328166.shtmlIOS/MAC中使用Thrift框架,就是使用brew

http://tieba.baidu.com/p/1744291285thrift客户端嵌入android……

http://blog.sina.com.cn/s/blog_59c4c2ed01010pwe.htmlthrift下C++服务器和客户端开发

http://shiyanjun.cn/archives/456.html基于Thrift实现跨语言服务

http://thrift.apache.org/download 官网

http://luajit.org/ext_ffi.html FFI库 本来是用这个工具去让lua连接dylib的,但是既然mac编译出了.so,那么就不用了

http://www.tuxi.com.cn/viewb-305205-305205457473562564.htmlCocos
Code IDE lua 高手指导下lua系列

http://wenku.baidu.com/link?url=DNPtqZmPVQc-ebh7MfeH7BgV1OiyZLJhsG0cgqTjb8nfgt7GGNoJ4c7O4hTmuwaOtiZoWBoUAVeQ5W0LW0diDLmQ-s1grg--oj81QKCLIdaThrift框架使用教程
c#

http://blog.csdn.net/amuseme_lu/article/details/6262572 Apache Thrift的简单使用

http://tech.uc.cn/?p=2668 初探Thrift客户端异步模式

http://blog.csdn.net/qq910894904/article/details/41132779Thrift官方安装手册(译)

http://dongxicheng.org/search-engine/thrift-guide/Thrift使用指南

http://www.233.com/linux/fudao/20081120/094425945.htmlLinux中.a,.la,.o,.so文件的意义和编程实现

http://blog.sina.com.cn/s/blog_6af956630101be6q.htmlLua脚本学习第一章

http://blog.csdn.net/longxj04/article/details/9118891linux
头文件以及库的路径

http://directory.fsf.org/wiki/Bison Bison

http://my.oschina.net/baoer1024/blog/40305用thrift实现多语言相互调用

http://www.cnblogs.com/LinuxHunter/archive/2010/11/27/1889399.html如何编写lua扩展

http://blog.codingnow.com/2006/11/lua_c.htmlLua
中写 C 扩展库时用到的一些技巧

http://www.micmiu.com/soa/rpc/thrift-sample/Thrift入门及Java实例演示

http://www.cnblogs.com/liping13599168/archive/2011/09/15/2176836.htmlThrift初探:简单实现C#通讯服务程序

http://m.blog.csdn.net/blog/u010926176/39004517thrift--thrift使用说明

时间: 2024-10-07 12:23:03

thrift for lua 使用记录的相关文章

thrift的lua实现

最近要进行系统升级,后台的数据是根据城市区分的.担心新系统的稳定性及新数据的准确性,计划部分城市采用新接口.接口的入参里没有城市信息,只有经纬度坐标,需要调用一个thrift接口来根据坐标获取城市信息. 如果直接修改代码逻辑,则会造成新旧版本的耦合,不仅完全上线时要再次修改,而且还要增加一次测试流程,这样成本就有些高了.这时就想到能不能用nginx+lua对新旧版本接口做灰度发布. 步骤: 1.安装thrift 2.生成客户的代码  3.编译lua调用thrift需要的库 4.实现客户端代码 5

Apache Thrift 服务开发框架学习记录

Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架. 前言: 目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Service,基于 JSON 消息格式的 RESTful 服务等.其中所用到的数据传输方式包括 XML,JSON 等,然而 XML 相对体积太大,传输效率低,JSON 体积较小,新颖,但还不够完善. 本文将介绍由 Facebook 开发的远程服务调用框架 Apache Thrift,它采用接口描述语言定义并创

在Linux上部署Lua的记录

因为Lua开发早晚要与C结合,也就是要编译C,所以从源代码编译Lua显然是个顺理成章的方案. 所以,首先: apt install build-essential libreadline-dev 如果系统里没安装libreadline-dev的话,在make时会遇到普遍碰到的Error,如果有兴趣看看报错信息,也不妨故意跳过这一步,等出错后再回头补充安装,亦无不可. 接着: cd /tmp curl -R -O http://www.lua.org/ftp/lua-5.3.3.tar.gz #当

菜鸟学习 - Unity中的热更新 - Lua和C#通信

孙广东 2015-4-6 热更新我是个菜鸟,感谢网上的各位的奉献,这次又当一回搬运工. 准备: 1.了解Lua的语法 推荐书籍<Lua程序设计 第二版> 2.使用ULua插件进行通信 尽量早上真机.因为Bug问题特别多. 大杂烩: 更新LUa其实也是更新资源. Lua被看作一个资源么.Lua代码都是运行时才编译的,不运行的时候就如同一张图片.一段音频一样,都是文件资源:所以更新逻辑只需要更新脚本,不需要再编译,因而Lua能轻松实现"热更新".运行效率由于使用反射,所以成为它

Unity中使用ulua的个人经验总结

热度 286052 2015-3-15 14:32 |个人分类:技术类| Lua Lua代码都是运行时才编译的,不运行的时候就如同一张图片.一段音频一样,都是文件:所以更新逻辑只需要更新脚本,不需要再编译,因而Lua能轻松实现“热更新”.Ulua是一款非常实用的unity插件,它能让unity支持Lua语言,而且运行效率还不错.下面就跟大家谈谈我用ulua的一些心得. Ulua的使用流程一般为: 实例化LuaState对象(new LuaState())è加载Lua代码(LuaState. Do

lua 中关于时间戳和可读时间格式的一点记录

lua 标准库中提供了关于时间的函数os.time()和os.date(),这两个函数使用起来还是有需要注意的地方的:这两个函数的结果都是加入了时区:比如我现在系统是GMT+8; os.time({year=1970, month=1, day=1, hour=0})计算出来的是-28800,也就是86060:计算的是当前table中给定的时间距离1970.1.1 08:00时间的秒数,所以就得到负数了: C标准库中,time()函数得到的时间戳其实也是加入了时区,也就是说不管你系统是那个时区,

ubuntu下针对php的thrift 安装折腾记录

此安装针对php开发配置 按照官方的文档做法,会出现各种bug,总结正确的安装方法: STEP1: 安装必要的依赖插件: sudo apt-get install libboost-dev libboost-test-dev libboost-program-options-dev libevent-dev automake libtool flex bison pkg-config g++ libssl-dev sudo apt-get install php5-dev php5-cli ph

[lua, mysql] 将多条记录数据组合成一条sql插入语句(for mysql)

-- 演示将多条记录数据组合成一条sql插入语句(for mysql) function getTpl0(tname) -- 获取表各个字段 local t = { tpl_pack = {"packId","itemId","`group`","num","rate","rateType"}, } for k, v in pairs(t) do if tname == k then r

cocos2d-x 3.1.1 lua 翻转方块 Flips Blocks记录

游戏规则: 游戏有3个等级,简单,中等,困难.对应的是3x3,5x5和9x9的方格数. 每次点击一个方块,与方块相邻的方块会转变颜色. 颜色是按顺序改变的,一共有2种颜色. 当所有方块都显示同一种颜色的时候,游戏结束. 游戏需要记录玩家的操作时间. 游戏退出的时候需要记录目前的状态和时间. 游戏再次启动的时候,检测之前是否有记录,有的话恢复之前的状态. 本项目使用了cocos2d-x 3.1.1 和 code ide github地址:Flip Blocks 在publish有编译好的apk文件