在我的上一篇日志中提到使用luabind来导出C++类会很方便,但是通常来说,一个类中都会有几十个函数需要被导出,而我们手头上往往有几十个这样的类。如果要人工去一个一个为它们写导出API,那将会是一件十分令人崩溃的事情!对于boost::python来说,有一个现成的工具(具体叫什么名字请询问亮哥…)。但luabind就没有这般幸运了~所以我决定自己写一个。
我最初的做法是完全使用正则表达式来匹配各种类和函数,花了一整天时间做出来一个有着许多错误,但经过人手动修改修改也勉勉强强能用的版本。在这个过程中我深深地了解到了从“还不错”到“完美”之间存在着多大的鸿沟。这让我下定决心要用词法分析的做法重新写一个。但是C++的词法何其复杂,如果要自己手写一个那就实在是太浪费时间了!经过亮哥指点,我使用clang作为词法分析器,并使用其python包装,完成了为C++自动生成luabind api的第一个版本。
工具github地址:https://github.com/kidsang/LuabindAutoWrap
因为我已经把clang的dll也放在了仓库里,所以理论上来说,只要下载下来就可以用了。这是个使用python写成的工具,所以为了使用它你首先需要下载安装python2.7
源码主要有三个文件,其中parse.py负责调用clang的函数对文件进行分析,construct.py负责输出格式化后的api代码,autowrap.py是一个调用工具进行api包装的例子。
目前版本为0.1,主要的功能是为C++的类导出luabind api。其中包含了以下缺陷:
- 不支持静态成员函数,事实上,它会把它们当做非静态的函数导出,需要手动去删……
- 不支持运算符重载,并且不会进行导出。
- 不支持成员函数重载,会导出多个重复的api,需要手动去删……
这些缺陷我会慢慢地改进。之所以是“慢慢地”,主要原因是这个工具主要是我写给自己用,为了辅助SaberCore开发的。目前的程度已经可以为我节省大量的时间了,在向其中投入时间会使回报不成比例。不过我会抽空完善。
使用的注意事项:如果你想为一个文件file1.h生成api,而file1.h中有#include “file2.h”,那么你必须保证他们之间的路径正确,否则clang会因为找不到file2.h而解析失败。
下面是为OgreMatrix4生成api的例子。
导出结果的截图:
评论