20070706 Lua c++ 资料
http://www.yippeesoft.com
1、编译Lua
下载到Lua的源代码以后,解压缩,里面会有4个文件夹外加一堆文件。其中src文件夹里面就是我们要用到的。
打开VS2003或者VS2005,新建一个空的Win32控制台应用程序,注意要是空的哦。这里假设该工程的目录在D:\\lua。将刚才的src里的所有.h和.c文件拷贝到工程根目录下,也就是D:\\lua下面。在VS中的“解决方案”视图中,右键点击“头文件”,添加现有项,将刚才拷贝过来的所有的.h文件添加到工程里,同样地把所有的.c文件添加到“源文件”目录中。将当前配置由debug改为release,从主菜单中进入项目->属性,找到“常规”选项卡,将右边的“配置类型”改为“静态库 (.lib)”。然后生成解决方案就行了。此时我们在D:\\lua\\Release下面的一大堆.obj文件中会找到一个叫做lua.lib的文件,就是它了。
2、使用Lua
同样新建一个空的Win32控制台应用程序,假设工程目录是D:\\test。在工程根目录下面新建一个叫做lua的目录,也就是D:\\test\\lua,用于存放lua的头文件和库文件。将src里的所有.h文件拷贝到刚才新建的目录里。在解决方案中新建一个“lua”文件夹,将D:\\test\\lua目录中所有的文件加入进去。然后在源文件里面新建一个main.cpp,作为控制台应用程序的入口文件。mail.cpp的最初代码如下:
extern "C"
&leftsign;
#include "lua/lua.h"
#include "lua/lualib.h"
#include "lua/lauxlib.h"
&rightsign;
int main(int argc, char** argv)
&leftsign;
return 0;
&rightsign;
将刚才编译得到的lua.lib拷贝到D:\\test\\lua目录下面。然后在项目属性里,选择配置属性->链接器->输入,在右边的附加依赖项中添加一行lua/lua.lib。
下面,我们就可以开始使用lua了。
…..
问题1:luaopen_io()函数导致程序崩溃
在user manual的Incompatibilities with the Previous Version -> Changes in the API中提到:
The luaopen_* functions (to open libraries) cannot be called directly, like a regular C function. They must be called through Lua, like a Lua function.
在lua 5.1中,api 中的 luaopen_*现在和lua调用其它普通c函数的过程一样:
lua_pushcfunction(L, luaopen_*);
lua_call();
也可以用
lua_cpcall(L, luaopen_*, 0);
简化上面两步的操作, 实际了看lua_cpcall的源码就知道,是一样的
lua 5.1推荐的开始调用lua的写法是这样的:
lua_State *L = luaL_newstate();
lua_cpcall(L, luaopen_base, 0);
lua_cpcall(L, luaopen_io, 0);
lua_cpcall(L, luaopen_string, 0);
// …
// …
问题2:你也不能再使用lua_dofile()或者lua_dostring()这样古老的函数了,下面是新的方式
// 从文件执行
int s = luaL_loadfile(L, "test/hello.lua");
if ( s==0 )
&leftsign;
// execute Lua program
s = lua_pcall(L, 0, LUA_MULTRET, 0);
&rightsign;
// 从字符串执行
const char *buf = "print(\’hello, world!\’)";
s = luaL_loadstring(L, buf);
if ( s==0 )
&leftsign;
// execute Lua program
s = lua_pcall(L, 0, LUA_MULTRET, 0);
&rightsign;
luawrapper的BUG比较多,目前因为我没有在使用lua,所以不敢继续放出来。
lua的C++封装的确很多,欧是看到CEGUI用了tolua++才决定转用这个的tolua++支持类的继承、函数的默认参数等许多功能,并且还有一个自己的编译器可以将类似c++格式的包声明自动转换成可直接导入到lua脚本的c源码
lua的C++封装实现吧,俺先用了luaplus最近又用了tolua++感觉后者在封装上要方便且强大很多,只是不知道效率如何(没空去仔细看源码呀,汗一个先)不知楼主有何高见
推荐使用luaplus。http://www.cnblogs.com/ly4cn/archive/2005/11/27/285439.html
或者 LuaBind:
http://www.rasterbar.com/products/luabind.html
luabind是一个帮助你直接绑定C++和lua的库. 他有向lua直接暴露在C++代码中编写的函数和类的能力.他也给你提供了在lua中定义类,并且可以从其他lua中定义的类或者C++中定义的类继承的能力. lua中的类能够重写那些在c++定义的基类的虚函数. 他是面向lua5.0开发的,并不能支持lua4.
luabind 是使用模板元编程实现的.这意味着在你编译自己的项目时不需要额外的预处理过程(由编译器完成). 这也同样意味着你不(经常)需要知道每个要注册的函数的精确签名信息, 因为这个库将会生成的代码完全依赖于编译时函数的类型信息(包括签名). 这种方法的主要不利点就是整加函数注册过程的文件的编译时间, 因此推荐你在一个cpp文件中注册所有需要的东西.
作者: 大宝天天见
Blog: http://www.cppblog.com/singohgod
本人水平有限,有错请指出,欢迎交流,共同进步!
国内关于Lua的资料实在是太少,为了寻找一个合适的Lua的C++封装,真是如同大海捞针.在看了众多资料后锁定以下几种:LuaBind ToLua++ LuaPlus.在选择上颇有讽刺的味道,LuaBind的版本号还没到1.0,加上网友颇有微词,放弃.ToLua++本来有朋友推荐,但是怎么都找不到下载,官网就是打不开,无赖放弃.就只有LuaPlus了
Luabind非常好地建立了从C++到lua脚本的扩展,但存在几个普遍的问题:
1.C++泛型和接口式编程天生的不兼容性,编译期和运行期多态的本质有别。
2.要使用 Luabind,需要关联lua,特别是几十兆的boost,自己用无所谓,要用于小组开发,god dam n官僚的软件工程。
3.现在相对越来越慢的CPU,大量的泛型技巧的编译速度实在令人难以忍受。
4.接口化引擎是必然的,只有从lua底层作起。
Luabind
Luabind is a library that helps you create bindings between C++ and Lua. It has the ability to expose functions and classes, written in C++, to Lua. It will also supply the functionality to define classes in lua and let them derive from other lua classes or C++ classes. Lua classes can override virtual functions from their C++ baseclasses. It is written towards Lua 5.x, and does not work with Lua 4.
LuaPlus是Lua的C++增强,也就是说,LuaPlus本身就是在Lua的源码上进行增强得来的。用它与C++进行合作,是比较好的一个选择。
LuaPlus目前版本为:LuaPlus for Lua 5.01 Distribution Build 1080 (February 28, 2004)。大家可以到http://luaplus.org/ 站点下载:
源码 (http://wwhiz.com/LuaPlus/LuaPlus50_Build1081.zip)
目标码 (http://wwhiz.com/LuaPlus/LuaPlus50_Build1081_Win32Binaries.zip)
tolua++ is an extended version of tolua, a tool to integrate C/C++ code with Lua. tolua++ includes new features oriented to c++ such as:
* Support for std::string as a basic type (this can be turned off by a command line option).
* Support for class templates
一.tolua++简介
tolua++是一种第三方的软件包,可以为Lua提供面向对象的特性,这样我们就可以使用Lua来编写使用C++语言库的脚本文件.
二.tolua++的编译.
tolua++的主页在http://www.codenix.com/~tolua/,目前的最新版本是1.0.7,为了使用tolua++,我们需要三个文件:
1.bin/tolua++[.exe] – tolua++的可执行程序
2.include/tolua++.h – tolua++的头文件
3.lib/libtolua++.a or lib/tolua++.lib – tolua++的静态库(当然有的时候也需要生成动态库,可以参考我下面给出的文章的网址,我们先从最简单的入手)
使用tolua++的时候,都需要使用tolua++的可执行程序自动生成一个.pkg文件生成对应的.c(C语言)或者.cpp文件(C++语言),然后把这个文件和对应的C\\C++文件一起编译生成可执行程序,这样就可以对对应的Lua脚本进行读取操作.在后面将结合代码例子对这个过程进行详细的讲解.
tolua++的编译比较麻烦,官方的编译说明需要scons这个软件,下面介绍另一种办法,只需要Lua就可以了(本身编写Lua脚本文件不可能不用到Lua解释器,所以这个算不上什么负担了:)
说明一下,这个办法不是我想出来的,出处在这里:
http://lua-users.org/wiki/CompilingToluappWithoutScons
官方下载的tolua++文件夹里面已经有了上面提到的1和2文件了,我在这里偷懒,就只说3的生成.
其实在上面的文档里面写得很清楚了,如下编译生成静态库文件:
tolua++_1.0.5-1\\src\\lib> gcc -c *.c -I..\\..\\include -I <path_to_lua>\\include
tolua++_1.0.5-1\\src\\lib> ar rcsv libtolua++.a *.o
历史博文
- 20080802 xpe wpf ok - 2009
- 1014 WM_DEVICECHANGE GUID OK 2 - 2007
- 0129 sip sipxezphone 试用 - 2006
- 信息孤岛 软件开发的疑惑 - 2005