使用SWIG封装c++类以在Lua中使用它-需要一个简单的例子



在使用SWIG和lua方面,我是一个绝对的初学者,也是一个平庸的C++开发人员,我似乎不明白如何将C++类与lua绑定。

我的最终目标是拥有一个类的实例,将它传递给我的lua脚本,该脚本以某种方式操纵该对象,然后我在c++中检索该对象,并对它做我想做的任何其他事情。

所以。。。我已经下载了Lua和C++,编译了一些例子,我能够在我的C++程序中运行一些Lua脚本。到目前为止还不错。

现在,我已经下载了SWIG。我在Windows7上使用VC2010。据我所知,我想创建一个接口文件。所以我创建了一个例子。I:

%module creature
class Creature
{
public:
    Creature(void);
    Creature(int id);
    ~Creature(void);
(...) the rest of my class here

(刚刚在我的creature.h中添加了%module生物,并将其保存为生物.i)。我使用运行SWIG

 swig -c++ -lua creature.i

得到了我的creature.cxx文件。

现在,我可能会让自己难堪,但是。。。我不知道下一步该怎么办。我是否应该以某种方式构建输出文件?我现在如何使用它?我在这里读过http://www.swig.org/Doc1.3/Lua.html我需要将生成的文件(*.cxx)与我的其余代码链接起来(所以我只需将文件包含在我的项目中并添加#include"Creature.h"行即可)。但当我编译时,我会遇到类似的错误

error C2065: 'LUA_GLOBALSINDEX' : undeclared identifier
error C2036: 'const luaL_reg *' : unknown size

我也尝试过使用MinGW编译它,但我遇到了同样的问题。如果有人能给我一个例子或一个循序渐进的教程,告诉我如何一起使用这些工具,那就太好了,因为我很难理解整个想法。这肯定是因为我不了解如何使用它的基本原理,所以请温和一点。

任何帮助都将不胜感激。

SWIG是一个将脚本语言链接到C或C++代码的工具。它的工作原理类似于预处理步骤:在.SWIG文件上运行SWIG可执行文件,该文件会生成一些C或C++代码。然后,您可以将该代码构建到您想要链接到该脚本语言的任何项目中。

SWIG的Lua支持肯定与Lua 5.2不兼容。事实上,您会发现与Lua 5.2兼容的代码很少。如果你真的想用Lua代码做点什么,至少暂时坚持5.1。

我的最终目标是拥有一个类的实例,并将其传递给我的lua以某种方式操纵该对象的脚本,然后我检索在c++中的那个对象,然后用它做我想做的任何其他事情。

我可能错了,但你不会把C++类的实例"传递"给Lua,你真正要做的是创建到Lua的C++绑定,从而在Lua脚本本身中实例化C++类。

例如,假设您有一个名为Foo的C++类,其中有一个称为add(x,y)的方法。然后,您可以在Lua中实例化并使用该类,方法如下(假设您已经使用Swig创建了包装文件)。

foo_instance = Foo()
foo_instance:add(4, 3)

我在C++程序中使用Swig和Lua时遇到了一些不幸,所以我写了一个教程(这样我就不会忘记我是如何做到的)。你可以在这里查看。。。http://glennmccord.wordpress.com/2012/11/05/binding-c-to-lua-using-swig/

希望它能让你开始。

最新更新