LuaPlus上手指南(1)

 

 

版权所有,转载请注明出处,勿用于商业用途,谢谢!

作者:    大宝天天见

Blog:    http://www.cppblog.com/singohgod

本人水平有限,有错请指出,欢迎交流,共同进步!

 

国内关于Lua的资料实在是太少,为了寻找一个合适的LuaC++封装,真是如同大海捞针.在看了众多资料后锁定以下几种:LuaBind ToLua++ LuaPlus.在选择上颇有讽刺的味道,LuaBind的版本号还没到1.0,加上网友颇有微词,放弃.ToLua++本来有朋友推荐,但是怎么都找不到下载,官网就是打不开,无赖放弃.就只有LuaPlus,看到一些人的评价还行,于是决定就用它吧.

LuaPlus的资料就更少了,连怎么配置怎么调试等什么都没有,只有沐枫大哥讲解了语法方面的一篇文章.啊哟,怎么搞呢,难道又只有硬着头皮上了?(某伟人曾说过,但凡杰出的事都是硬着头皮干出来滴)

好了,言归正传,下面讲讲我的经验吧:

 

如何编译

1.       下载

首先到官方网站下载: http://www.luaplus.org/

下载这个: All source code: http://luaplus.org/LuaPlus51_Build1100.zip (我当前的版本,当然越新越好)

 

2.       剥离

解开下载包,打开 \LuaPlus51_Build1100\Src\LuaPlus 里面是全部源文件,src下是lua的源文件.这里有个令人疑惑的地方,源文件中带了一些不需要的文件,要剔除去,基本上需要以下这些文件:

1)      Lua库文件:

lapi.c

lapi.h

lauxlib.c

lauxlib.h

lbaselib.c

lcode.c

lcode.h

ldblib.c

ldebug.c

ldebug.h

ldo.c

ldo.h

ldump.c

lfunc.c

lfunc.h

lgc.c

lgc.h

linit.c

liolib.c

llex.c

llex.h

llimits.h

lmathlib.c

lmem.c

lmem.h

loadlib.c

lobject.c

lobject.h

lopcodes.c

lopcodes.h

loslib.c

lparser.c

lparser.h

lstate.c

lstate.h

lstring.c

lstring.h

lstrlib.c

ltable.c

ltable.h

ltablib.c

ltm.c

ltm.h

lua.h

luaconf.h

lualib.h

lundump.c

lundump.h

lvm.c

lvm.h

lzio.c

lzio.h

print.c

 

2)      LuaPlus头文件:

auxiliar.h

LuaAutoBlock.h

LuaCall.h

LuaFunction.h

LuaHelper.h

LuaHelper_Object.h

LuaHelper_StackObject.h

LuaLink.h

LuaObject.h

LuaObject.inl

LuaPlus.h

LuaPlusCD.h

LuaPlusFunctions.h

LuaPlusInternal.h

LuaStackObject.h

LuaStackObject.inl

LuaStackTableIterator.h

LuaState.h

LuaState.inl

LuaStateOutFile.h

LuaTableIterator.h

luathread.h

pt.h

srm.h

 

3)      LuaPlus源文件

LuaCall.cpp

LuaObject.cpp

LuaPlus.cpp

LuaPlusAddons.c

LuaPlusFunctions.cpp

LuaPlus_Libs.cpp

LuaStackObject.cpp

LuaStackTableIterator.cpp

LuaState.cpp

LuaStateOutFile.cpp

LuaState_DumpObject.cpp

LuaTableIterator.cpp

lwstrlib.c

 

 

3.       建立项目

然后你就可以在VS中建立一个新项目,静态链接库的:

分别把需要的文件加进去,之后编译,应该能通过了.

 

如何使用

接着讲讲如何在你的其他项目中使用LuaPlus.

1.必要的配置

你的项目可能是这样的:

设置GameClient的依赖项是LuaPlusLib

#include "LuaPlus.h"

using namespace LuaPlus;

记得干这事

 

2.创建一个状态

LuaStateOwner state;

今后的操作都围绕这个state

 

3.执行脚本

int iret = state->DoFile("test.lua");

返回值为0表示成功,否则不成功.

 

4.C++中获取Lua脚本的变量

假设你的test.lua中有:

health = 200;

通过下列方法就可以在C++中得到这个数值

int mytest = state->GetGlobal("health").GetInteger();

 

5.C++中调用Lua脚本里的函数

假设你的test.lua中有:

function Add(x, y)

       return x+y;

end

C++中需要先声明这个函数:

LuaFunction<float> Add =  state->GetGlobal("Add");

这样你就有了Add()这个函数,然后就可以像平常一样使用它了:

float myret = Add(3.14f,5.25f);

 

6.Lua脚本中调用C++函数

在读取test.lua之前要先把C++函数注册到Lua的运行时栈里,这样在执行lua脚本的时候,才知道执行哪一个函数:

首先有函数:

int LS_PrintNumber(LuaState* state)

{

LuaStack args(state);

 

       if (args[1].IsNumber()) {

              printf("%f\n", args[1].GetNumber());

       }

       return 0;

}

然后注册这个函数到Lua:

state->GetGlobals().Register("PrintNumber", LS_PrintNumber);

这样就把LS_PrintNumber映射为Lua中可以使用的函数PrintNumber.

Test.lua脚本中添加调用语句:

PrintNumber(30);

state->DoFile("test.lua");执行的时候,就执行了C++中的这个函数.

 

总结

本文介绍了LuaPlus的基本配置方法和使用,希望对你有帮助.下一篇将介绍一些高级特性,如怎样在VS中调试LuaPlus的脚本,以及对类的操作等.

如果还有任何疑问可以看看下面这个简单的例子:
 /Files/singohgod/LuaPlus_Test.rar

 

posted on 2007-04-16 23:22 大宝天天见 阅读(11112) 评论(11)  编辑 收藏 引用 所属分类: 6.Lua/XML

评论:
# re: [原创]LuaPlus使用报告(1) 2007-04-18 21:25 | missdeer
有个韩国人写的轻量级的封装LuaTinker,很简单,才2个文件
另外,以前看样子好像LuaBind要合入Boost,不过后来一直没什么动静了-_-b本来还有点期待的  回复  更多评论
  
# re: [原创]LuaPlus使用报告(1) 2007-04-28 11:39 | enter
下一篇怎么还不出来
等急了  回复  更多评论
  
# re: [原创]LuaPlus使用报告(1) 2007-05-08 14:25 | 大宝天天见
这样的教程行文方式是否能便于理解和快速上手?大家都实验成功了吗?搜集点意见哈~  回复  更多评论
  
# re: [原创]LuaPlus上手指南(1) 2007-06-08 09:04 | 包子西施
谢谢搂主,但是我有一个问题就是:怎么在Lua脚本中写类的对象以及成员函数;并与其绑定。我写的完全没有反应阿。请多多执教  回复  更多评论
  
# re: [原创]LuaPlus上手指南(1) 2007-06-29 17:26 | jimmy
编译LuaPlus的时候出现了连接错误:

error LNK2005: "unsigned int __cdecl LuaPlus::lua_WChar_len(unsigned short const *)" (?lua_WChar_len@LuaPlus@@YAIPBG@Z) 已经在 LusPlus.lib(LuaObject.obj) 中定义

请问这是什么原因的?  回复  更多评论
  
# re: [原创]LuaPlus上手指南(1) 2007-07-17 16:58 | 木木de
期待(2)  回复  更多评论
  
# re: [原创]LuaPlus上手指南(1) 2008-07-18 11:26 |
gameclient 不成功 LuaPlus可以生成静态连接库,什么原因啊
1>LuaPlus.obj : error LNK2019: 无法解析的外部符号 "public: static class LuaPlus::LuaState * __cdecl LuaPlus::LuaState::Create(void)" (?Create@LuaState@LuaPlus@@SAPAV12@XZ),该符号在函数 "public: __thiscall LuaPlus::LuaStateOwner::LuaStateOwner(void)" (??0LuaStateOwner@LuaPlus@@QAE@XZ) 中被引用
1>LuaPlus.obj : error LNK2019: 无法解析的外部符号 "public: static void __cdecl LuaPlus::LuaState::Destroy(class LuaPlus::LuaState *)" (?Destroy@LuaState@LuaPlus@@SAXPAV12@@Z),该符号在函数 "protected: void __thiscall LuaPlus::LuaStateAuto::Assign(class LuaPlus::LuaState *)" (?Assign@LuaStateAuto@LuaPlus@@IAEXPAVLuaState@2@@Z) 中被引用
1>LuaPlusLib.lib(LuaState.obj) : error LNK2019: 无法解析的外部符号 "public: class LuaPlus::LuaObject __thiscall LuaPlus::LuaState::GetGlobals(void)" (?GetGlobals@LuaState@LuaPlus@@QAE?AVLuaObject@2@XZ),该符号在函数 "public: class LuaPlus::LuaObject __thiscall LuaPlus::LuaState::GetGlobal(char const *)" (?GetGlobal@LuaState@LuaPlus@@QAE?AVLuaObject@2@PBD@Z) 中被引用
1>LuaPlusLib.lib(LuaState.obj) : error LNK2019: 无法解析的外部符号 "public: static class LuaPlus::LuaState * __cdecl LuaPlus::LuaState::CastState(struct lua_State *)" (?CastState@LuaState@LuaPlus@@SAPAV12@PAUlua_State@@@Z),该符号在函数 "void __cdecl LPCD::Push(struct lua_State *,int (__cdecl*)(class LuaPlus::LuaState *))" (?Push@LPCD@@YAXPAUlua_State@@P6AHPAVLuaState@LuaPlus@@@Z@Z) 中被引用
1>LuaPlusLib.lib(LuaStackObject.obj) : error LNK2001: 无法解析的外部符号 "public: static class LuaPlus::LuaState * __cdecl LuaPlus::LuaState::CastState(struct lua_State *)" (?CastState@LuaState@LuaPlus@@SAPAV12@PAUlua_State@@@Z)
1>LuaPlusLib.lib(LuaObject.obj) : error LNK2001: 无法解析的外部符号 "public: static class LuaPlus::LuaState * __cdecl LuaPlus::LuaState::CastState(struct lua_State *)" (?CastState@LuaState@LuaPlus@@SAPAV12@PAUlua_State@@@Z)
1>LuaPlusLib.lib(lapi.obj) : error LNK2019: 无法解析的外部符号 _LuaState_UserStateThread,该符号在函数 _lua_newthread 中被引用
1>LuaPlusLib.lib(LuaStackObject.obj) : error LNK2019: 无法解析的外部符号 "public: __thiscall LuaPlus::LuaException::LuaException(char const *)" (??0LuaException@LuaPlus@@QAE@PBD@Z),该符号在函数 "public: char const * __thiscall LuaPlus::LuaStackObject::GetString(void)const " (?GetString@LuaStackObject@LuaPlus@@QBEPBDXZ) 中被引用
1>LuaPlusLib.lib(LuaObject.obj) : error LNK2001: 无法解析的外部符号 "public: __thiscall LuaPlus::LuaException::LuaException(char const *)" (??0LuaException@LuaPlus@@QAE@PBD@Z)
1>LuaPlusLib.lib(LuaTableIterator.obj) : error LNK2001: 无法解析的外部符号 "public: __thiscall LuaPlus::LuaException::LuaException(char const *)" (??0LuaException@LuaPlus@@QAE@PBD@Z)
1>LuaPlusLib.lib(LuaCall.obj) : error LNK2001: 无法解析的外部符号 "public: __thiscall LuaPlus::LuaException::LuaException(char const *)" (??0LuaException@LuaPlus@@QAE@PBD@Z)
1>LuaPlusLib.lib(LuaStackObject.obj) : error LNK2001: 无法解析的外部符号 "public: __thiscall LuaPlus::LuaException::~LuaException(void)" (??1LuaException@LuaPlus@@QAE@XZ)
1>LuaPlusLib.lib(LuaObject.obj) : error LNK2001: 无法解析的外部符号 "public: __thiscall LuaPlus::LuaException::~LuaException(void)" (??1LuaException@LuaPlus@@QAE@XZ)
1>LuaPlusLib.lib(LuaTableIterator.obj) : error LNK2001: 无法解析的外部符号 "public: __thiscall LuaPlus::LuaException::~LuaException(void)" (??1LuaException@LuaPlus@@QAE@XZ)
1>LuaPlusLib.lib(LuaCall.obj) : error LNK2001: 无法解析的外部符号 "public: __thiscall LuaPlus::LuaException::~LuaException(void)" (??1LuaException@LuaPlus@@QAE@XZ)
1>LuaPlusLib.lib(LuaStackObject.obj) : error LNK2001: 无法解析的外部符号 "public: __thiscall LuaPlus::LuaException::LuaException(class LuaPlus::LuaException const &)" (??0LuaException@LuaPlus@@QAE@ABV01@@Z)
1>LuaPlusLib.lib(LuaObject.obj) : error LNK2001: 无法解析的外部符号 "public: __thiscall LuaPlus::LuaException::LuaException(class LuaPlus::LuaException const &)" (??0LuaException@LuaPlus@@QAE@ABV01@@Z)
1>LuaPlusLib.lib(LuaTableIterator.obj) : error LNK2001: 无法解析的外部符号 "public: __thiscall LuaPlus::LuaException::LuaException(class LuaPlus::LuaException const &)" (??0LuaException@LuaPlus@@QAE@ABV01@@Z)
1>LuaPlusLib.lib(LuaCall.obj) : error LNK2001: 无法解析的外部符号 "public: __thiscall LuaPlus::LuaException::LuaException(class LuaPlus::LuaException const &)" (??0LuaException@LuaPlus@@QAE@ABV01@@Z)
1>LuaPlusLib.lib(lstate.obj) : error LNK2019: 无法解析的外部符号 _LuaState_UserStateFree,该符号在函数 _luaE_freethread 中被引用
1>LuaPlusLib.lib(lstate.obj) : error LNK2019: 无法解析的外部符号 _LuaState_UserStateOpen,该符号在函数 _lua_newstate 中被引用
1>../../Lib/Win32/luaplus.exe : fatal error LNK1120: 10 个无法解析的外部命令  回复  更多评论
  
# re: [原创]LuaPlus上手指南(1) 2008-12-23 11:14 | 忧郁骑士
谢谢你的例子,非常便于上手,让我一下子就把头疼很久的问题搞明白了。  回复  更多评论
  
# re: [原创]LuaPlus上手指南(1) 2009-08-27 17:41 | fianl
如何在VS2008上实现啊?具体的步骤·还有能不能用编译好的luaplus,直接包含相关头文件和LIB,这样可以不??谢谢  回复  更多评论
  
# re: [原创]LuaPlus上手指南(1) 2010-04-13 16:59 | Fanicy
帅哥,我最近在看SCITE,然后发现了LUA,最后找到你的LUAPlus,新主页上文件要怎么下啊,想下回来看看,我是新手,不知道怎么弄啊~~
那个git clone http://git.luaplus.org/luaplus51-all.git 下不下来,还有,GIT文件。。。呃。。。怎么用啊?

PS:小白问题多了点别见怪~~谢谢~~  回复  更多评论
  
# re: [原创]LuaPlus上手指南(1) 2010-08-07 18:03 | o0↓謎誷↑0o
@Fanicy
GIT其实就是一个类似SVN的物体。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理