cocos2dx 3.x bindings-generator(Part two)
来源:互联网 发布:2017云计算的上市公司 编辑:程序博客网 时间:2024/06/07 01:14
本想利用 cocos2d-x 自付的工具 bindings-generator 来将专案内的几个自写控件 binding 到 lua 下便于在 script 下控制,结果……真是他喵的坑啊….QAQ
cocos2d-x 3.0rc0 范例的 simple_test 的环境太单纯了,并且没有用到 cocos2d 内的任何物件,故!在撰写自己的 .ini 档时会遇上一狗票问题,于是要回头参考 tools/tolua 底下 cocos2d-x 本身的 lua binding 设定,这个说明能详细点吗? ~___~
把遇到的几个问题列一下,供大夥儿参考一下。
问题1:
于 Win7 或 Win8 环境下,如果自订的类别有参考到 cocos2d-x 类,写完自个儿的 .ini 档后俐落的直接执行,会在执行 .bat 后看到类似的错误:
Errors in parsing headers:1. <severity = Warning,location = <SourceLocation file None, line 178, column 9>,details = "'__WCHAR_MAX__' macro redefined">2. <severity = Fatal,location = <SourceLocation file '../../../Evo/include/TalkWidgety.h', line 38, column 10>,details = "'cocos2d.h' file not found">
好,这个很直觉,请在 .ini 设定档里加上 cocos2d-x headers 的路径。
于是,就近搬移 cocos2dx.ini 里对于 cocos2d-x 内路径的设定。当然,如果还有用到其他的如 ui 或是 cocostudio 的话,要一并移进来。
待会儿会在下头将完成的范例贴一下就会明白这儿在说些啥玩意。
问题2:
搬移完 cocos2d-x 等相关的 header 路径后心想这应该就搞定了吧?
BUT!天底下哪有这么便宜的事!
执行后赫然喵到下面的错误…… TAT
Errors in parsing headers:1. <severity = Warning,location = <SourceLocation file None, line 179, column 9>, details = "'__WCHAR_MAX__' macro redefined">2. <severity = Warning, location = <SourceLocation file '../../../Evo/include/TalkWidgety.h', line 27, column 9>,details = '#pragma once in main file'>3. <severity = Fatal,location = <SourceLocation file 'D:../../../cocos/base\\CCConsole.h', line 30, column 10>,details = "'BaseTsd.h' file not found">
惨!这下该怎么办……
花了点时间看了下产生 cocos2d-x 的 genbindings.py 才恍然大悟,原来要加上-U__MINGW32__ 的 undef 来避免问题。
原因?自己去看 CCConsole.h 的错误点就知道问题在哪了!这里不想多说,伤心啊!
解决以上两个问题的 .ini 如下,仅供参考:
[evo]prefix = evo_bindingstarget_namespace = evocpp_namespace = Evo# 自定义的变数,偷懒用evo_root = ../../../../Evoevo_header = %(evo_root)s/includecocosdir = ../../../android_headers = -I%(androidndkdir)s/platforms/android-14/arch-arm/usr/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/includeandroid_flags = -D_SIZE_T_DEFINED_clang_headers = -I%(clangllvmdir)s/lib/clang/3.3/includeclang_flags = -nostdinc -x c++ -std=c++11# 从 cocos2dx.ini 等搬过来的cocos_headers = -I%(cocosdir)s/cocos/2d -I%(cocosdir)s/cocos/ui -I%(cocosdir)s/cocos/base -I%(cocosdir)s/cocos/physics -I%(cocosdir)s/cocos/2d/platform -I%(cocosdir)s/cocos/2d/platform/android -I%(cocosdir)s/cocos/math/kazmath -I%(cocosdir)s/extensions -I%(cocosdir)s/external -I%(cocosdir)s/cocos/editor-support -I%(cocosdir)scocos_flags = -DANDROID -U__MINGW32__evo_headers = -I%(evo_root)s/includeextra_arguments = %(android_headers)s %(clang_headers)s %(cocos_headers)s %(evo_headers)s %(android_flags)s %(clang_flags)s %(cocos_flags)s %(extra_flags)sheaders = %(evo_header)s/TalkWidget.hclasses = TalkWidgetremove_prefix =skip =base_objects =abstract_classes =classes_have_type_info = norename =rename_functions =rename_classes =# classes for which there will be no "parent" lookupclasses_have_no_parents =# base classes which will be skipped when their sub-classes found them.base_classes_to_skip =# Determining whether to use script object(js object) to control the lifecycle of native(cpp) object or the other way around. Supported values are 'yes' or 'no'.script_control_cpp = no
问题3:
如果自定义的类别里有自行定义的 namespace 时,跑 .bat 后看 output log 的最后一行会发现这样的错误:
Exception: The namespace (Evo::TalkWidget) conversion wasn’t set in ‘ns_map’ section of the conversions.yaml
好吧,看错误内容……来去找一下 conversions.yaml 这个档,位置应该在 /tools/bindings-generator/targets/lua 底下,直接用文字编辑器打开来看。
我勒了个去!果然要把自订的 namespace 加到 ns_map 的变数中,那个 .ini 里的 cpp_namespace 作用果然只是用来卖萌的吧….=A=
要加的内容如下:
ns_map:"cocos2d::extension::": "cc.""cocos2d::ui::": "ccui.""cocos2d::": "cc.""spine::": "sp.""cocostudio::": "ccs.""cocosbuilder::": "cc.""CocosDenshion::": "cc.""Evo::": "evo."
问题4:
解决以上三个问题后,我的老天爷啊!很尴尬的是居然又遇上一个鸟问题,错误如下:
File ../../tools/bindings-generator/evo/../generator.py", line 220, in from_type(ret_type, params) = r.groups()AttributeError: 'NoneType' object has no attribute 'groups'
……无言以对。
花了点时间看了下 generator.py 才发现,原来在 generator.py 的 line 219:
r = re.compile(‘function<(\S+) ((.*))>’).search(cdecl.displayname)
这里并没有考虑到会有人在类别里写 std::function< Object*()> 或 std::function< Object&()> 这样回传物件 pointer 或是 reference 的 functor,所以 regex 解析到坏掉。
也就是说,如果你的 code 里写了像这样的,请换个写法吧!
class TalkWidget : public cocos2d::ui::Widget{public:....bool setParseMethod(std::function<std::string&(const std::string&, const int)> &func);....};
如上面的 setParseMethod,func 是一个会回传 std::string reference (std::string&) 的 functor,这样子写就不行!
把整个 cocos2d-x 3.0rc0 找了遍……赫!果然整个 cocos2d-x 3.0rc0 里的 function functor 都是回传标准型别或干脆就是不回传任何玩意的 void。唉!真他喵的,踩到雷了……
由于不想多花时间去看整个 generator.py,所以,山不转路转,换个写法就好了。 =_=
[2014-5-2 注:到目前为止 3.0 正式版,完全没有解决 c++11 functional 与 lambda function 参数自动绑定到 lua 中的任何解决方法,所以,问题四就直接无视吧!]
但是,麻烦有看到的大大请帮忙提醒一下要改正这个问题啊!这个是明显的 bug 而不是说明不详细了!
转载:
http://www.cocoachina.com/bbs/read.php?tid-196037-page-1.html
http://www.cocoachina.com/bbs/read.php?tid-200145-page-1.html
- cocos2dx 3.x bindings-generator(Part two)
- cocos2dx 3.x bindings-generator(Part one)
- cocos2dx bindings-generator readme 文档翻译
- cocos2d-x bindings-generator(lua调用c++)
- cocos2d-x bindings-generator(lua调用c++)
- cocos2d-x 3.0rc0 - bindings-generator 问题与解决
- GObject Introspection bindings generator for Qt Projects
- 认识 Cocos2dx 3.x
- cocos2dx 3.x api
- 【cocos2dx 3.x】画线
- 【cocos2dx 3.x】CCSpriteBatchNode
- cocos2dx-3.x Note
- cocos2dx 2.x到cocos2dx 3.x的一些改变
- How to use bindings-generator to generate lua binding automatically
- cocos2dx 3.x 相机机制
- cocos2dx 3.x 异步加载
- cocos2dx 3.x 读取csv
- cocos2dx 3.x 移植android
- LDAP-SHA加密与解析
- android contentResolver与contentProvider如何关联在一起的
- 数据列存储和行存储
- linux驱动之定时任务timer,队列queue,小任务tasklet机制及用法
- Foundation框架—错误接收与异常处理
- cocos2dx 3.x bindings-generator(Part two)
- sql 存储过程 入门级 练习
- Linux做一个功能完备的路由器
- Android持续优化 - 提高流畅度
- 黑马程序员——网络编程
- 【POJ1502】【最大 单源最短路】【spfa】
- Block 复习
- 设计模式实例(Lua)笔记之三(Singleton单例模式)
- 统计学习笔记(4)——朴素贝叶斯法