C++导出到lua, 崩溃了, 史上最反人类的设定

我们游戏需要用到某库, 我愉快的开始了库接口导出到lua的旅程。 2天过后, 崩溃了。

原因1: 这点是库sb了, 库里的绝大部类都是用struct声明的。 呵呵, genbindings过滤了struct, 经过一番挣扎,只好把所有struct改成了class
原因2: c++内部用到的公有函数比需要导出的接口明显多, 各种skip写下来, 让我怀念起了pkg时代
原因3: 库有String Point 这样的结构, 虽然包含在namespace里面, 但和cocos的冲突了, 果断自定义了conversions.yaml generator.py 文件
原因4: 哪位大哥能告诉我, 类里面有运算符重载除了skip还有其他拯救方法么
原因5: 静态函数和成员函数不能重名。。。。。。 扑通, 给跪了
原因5: 8个构造函数, 4个要导出, 另外4个屏蔽 我不会啊啊啊啊啊啊啊啊啊啊啊
原因6: 首页上的“文档” 标签是来卖萌的吗。 说好的文档你在哪里
原因7: bool function(*outParam/&outParam) 扑通, 继续跪, 不知道怎么导出
原因8: function(cosnt class& obj) 为什么一定要创建一个临时对象, 对象不支持拷贝怎么办, 难道每个类型都要写一个luaval_to_class?

求再来一个pkg版本的tolua吧。。。。

你导出的东西,好像很厉害的样子。。
爱莫能助~

确实,这玩意号称cocos-lua,用起来却感觉不如以前的tolua,他也就是封装了一些lua方法……

一旦想要更多需求变得各种难搞。

继续吐槽
class:A(const std::string s);
class:A(int n);

这个函数导出到lua的时候, lua里使用obj:A(100)调用, c++代码里也会建立一个临时std::string对象, 特么的tolua_iscppstring 会把 100当字符串处理, 给跪了

同感,怀念tolua++虽然手动维护比较麻烦,但是最起码非常清楚问题在哪里,改起来其实也不复杂。

感觉可以在引擎外提供一个tolua++就好了

这不就是问题,这不就是用户需求么 ?

:8::8:

通常情况现有的比以前的要好用很多,当用到第三方库的时候,可以考虑自己封装一套常用接口绑定到lua,而不是整个绑定过去,这样很容易产生多个问题。

— Begin quote from ____

引用第6楼凤凰花开于2015-04-21 17:25发表的 回 楼主(kkvskkkk) 的帖子 :
通常情况现有的比以前的要好用很多,当用到第三方库的时候,可以考虑自己封装一套常用接口绑定到lua,而不是整个绑定过去,这样很容易产生多个问题。 http://www.cocoachina.com/bbs/job.php?action=topost&tid=297013&pid=1289410

— End quote

这个方法确实可行, 但要写的代码量会非常巨大。 在2.x版本上导出这个库到lua这个工作其实我是做过的, 当时的改动非常小。 而现在为了兼容这套导出机制, 我不得不修改大量的库源代码。

typedef void (*functionPtr )();
void function(functionPtr cb)

虽然这种函数lua是不需要的, 但由于这个函数是个重载函数, 其他同名函数是需要导出的, 然后就杯具了。。。。。。 导出工具无法识别functionPtr ,生成的c++代码 通通用 ?? 代替了 functionPtr 。

这个问题主要是由于
tolua_iscppstring的bug引起的, 但 每个重载分支都要跑一编的机制本身是有问题的。

修改.h文件


class:A(const std::string s);
class:A(int n);
调整为
class:A(int n);
class:A(const std::string s);

虽然可以绕过这个问题, 不过总感觉以后还会踩上这个坑