Lua学习之1 :C++调用Lua函数
2014-10-18 15:37
417 查看
一. 分享内容
主要分享了在C++中如何调用Lua函数,包括传递参数、获取返回值。
二. 开始分享
0. 准备Lua库
在Lua官网下载源码,这里下载的版本是5.1.5。源码根目录下的etc
文件夹中有luavs.bat,这个批处理脚本可以用来在VS编译器中编译出Lua库。使用
方法是:
依次打开VS(这里是VS2012)的TOOLS-->Visual Studio Command Prompt,
CD定位到Lua源码的根目录,如x:\xxx\lua-5.1.5,输入etc\luavs.bat,按enter。在
Lua的源码根目录的src文件夹下便多出了lua51.dll,lua51.lib库。将lua51.dll拷贝到
项目的exe目录下,并将lua51.lib、lua.h、lualib.h、lauxlib.h、luaconf.h拷贝到项目
的相应目录下(这里是将lua51.lib放在cpp目录下的lib文件夹中,将lua.h、lualib.h、
lauxlib.h、luaconf.h放在放在cpp目录下的include文件夹中)。
到此,准备Lua库的工作就结束了。
有Lua库后,在C++代码中调用Lua函数可通过以下几个步骤实现。
1. 创建Lua运行环境
我们知道,Lua通过lua_State的结构来保存数据,例如函数、变量等。所以
要想C++可以调用Lua函数,首先需要创建Lua运行环境。可以使用Lua提供的API
lua_open()或者luaL_newstate()来创建Lua环境。
2. 运行Lua脚本
在调用Lua的函数前,需要把Lua函数加载到Lua Stack中,这可以通过Lua API
luaL_dofile()来加载Lua脚本。它的返回值是0表明加载成功,而返回1表示加载失败。
3. 初始化Lua的基本接口
在C++中使用Lua的API之前,除了引用基本的头文件lua.h、lualib.h、lauxlib.h
以及基本的库luax.x.lib(如lua51.lib)之外,还需要做相应的库的初始化工作。例如
使用luaopen_base()初始化基本的lua库。
4. 获取Lua函数
加载完Lua脚本后并做相应的库的初始化工作后,想要调用Lua函数就必须先
找到它,lua_getglobal()这个LuaAPI可用来获取我们想要调用的Lua脚本中的函数。
5. 传递参数给lua函数
在C++代码里传递参数给Lua函数主要使用类似lua_toxxx()的这样Lua API来实
现,例如传递string参数可以使用lua_pushstring(),传递int参数用lua_pushinteger()。
6. 调用Lua函数
以上工作完成之后我们就可以调用Lua函数了,调用Lua函就是即调用Lua API中
的lua_pcall()。这个API中的参数2和参数3分别指出调用的Lua函数的参数的个数和
返回值的个数。
7. 获取Lua函数的返回值
通过lua_pcall()调用完Lua函数,它的返回值保存在Lua
stack的顶部,所以想
获取Lua函数返回值得先知道Lua stack顶部的索引。Lua stack有两种索引方式:
负数索引和整数索引。那么Lua stack的顶部的索引也就对应有两种方式:-1和
Lua stack的大小。Lua stack的大小可由lua_gettop()获取。知道Lua stack的顶部的
索引后,就可以通过形如lua_toxxx()(如使用lua_tointeger()获取int型返回值;可用
lua_tostring()获取string型返回值)的Lua API获取Lua函数的返回值了。在下面的
示例代码中给出了这两中方法的使用。
8. 编辑Lua脚本
在Lua文件xx.lua中编写Lua函数。下面的示例是在一个myLua.lua的脚本中编写
了以下函数
三. 示例代码
三. 完整的工程
下载完整的工程。
主要分享了在C++中如何调用Lua函数,包括传递参数、获取返回值。
二. 开始分享
0. 准备Lua库
在Lua官网下载源码,这里下载的版本是5.1.5。源码根目录下的etc
文件夹中有luavs.bat,这个批处理脚本可以用来在VS编译器中编译出Lua库。使用
方法是:
依次打开VS(这里是VS2012)的TOOLS-->Visual Studio Command Prompt,
CD定位到Lua源码的根目录,如x:\xxx\lua-5.1.5,输入etc\luavs.bat,按enter。在
Lua的源码根目录的src文件夹下便多出了lua51.dll,lua51.lib库。将lua51.dll拷贝到
项目的exe目录下,并将lua51.lib、lua.h、lualib.h、lauxlib.h、luaconf.h拷贝到项目
的相应目录下(这里是将lua51.lib放在cpp目录下的lib文件夹中,将lua.h、lualib.h、
lauxlib.h、luaconf.h放在放在cpp目录下的include文件夹中)。
到此,准备Lua库的工作就结束了。
有Lua库后,在C++代码中调用Lua函数可通过以下几个步骤实现。
1. 创建Lua运行环境
我们知道,Lua通过lua_State的结构来保存数据,例如函数、变量等。所以
要想C++可以调用Lua函数,首先需要创建Lua运行环境。可以使用Lua提供的API
lua_open()或者luaL_newstate()来创建Lua环境。
2. 运行Lua脚本
在调用Lua的函数前,需要把Lua函数加载到Lua Stack中,这可以通过Lua API
luaL_dofile()来加载Lua脚本。它的返回值是0表明加载成功,而返回1表示加载失败。
3. 初始化Lua的基本接口
在C++中使用Lua的API之前,除了引用基本的头文件lua.h、lualib.h、lauxlib.h
以及基本的库luax.x.lib(如lua51.lib)之外,还需要做相应的库的初始化工作。例如
使用luaopen_base()初始化基本的lua库。
4. 获取Lua函数
加载完Lua脚本后并做相应的库的初始化工作后,想要调用Lua函数就必须先
找到它,lua_getglobal()这个LuaAPI可用来获取我们想要调用的Lua脚本中的函数。
5. 传递参数给lua函数
在C++代码里传递参数给Lua函数主要使用类似lua_toxxx()的这样Lua API来实
现,例如传递string参数可以使用lua_pushstring(),传递int参数用lua_pushinteger()。
6. 调用Lua函数
以上工作完成之后我们就可以调用Lua函数了,调用Lua函就是即调用Lua API中
的lua_pcall()。这个API中的参数2和参数3分别指出调用的Lua函数的参数的个数和
返回值的个数。
7. 获取Lua函数的返回值
通过lua_pcall()调用完Lua函数,它的返回值保存在Lua
stack的顶部,所以想
获取Lua函数返回值得先知道Lua stack顶部的索引。Lua stack有两种索引方式:
负数索引和整数索引。那么Lua stack的顶部的索引也就对应有两种方式:-1和
Lua stack的大小。Lua stack的大小可由lua_gettop()获取。知道Lua stack的顶部的
索引后,就可以通过形如lua_toxxx()(如使用lua_tointeger()获取int型返回值;可用
lua_tostring()获取string型返回值)的Lua API获取Lua函数的返回值了。在下面的
示例代码中给出了这两中方法的使用。
8. 编辑Lua脚本
在Lua文件xx.lua中编写Lua函数。下面的示例是在一个myLua.lua的脚本中编写
了以下函数
function add(x, y) return x + y end
三. 示例代码
#include "stdafx.h" #include <stdlib.h> // include the lua header extern "C" { #include "include/lua.h" #include "include/lualib.h" #include "include/lauxlib.h" }; // include the lua lib #pragma comment(lib, "lib/lua51.lib") int _tmain(int argc, _TCHAR* argv[]) { // 1. open lua state lua_State* L = lua_open(); // or call luaL_newstate() // 2. open lua base function luaopen_base(L); // 3. load and run lua script int err = luaL_dofile(L, "myLua.lua"); if(err) { printf("luaL_dofile() error code : %d\n", err); system("pause"); } // 4. get my lua function lua_getglobal(L, "add"); // 5. push arg to lua stack for call my lua function int x = 100, y = 200; lua_pushinteger(L, x); lua_pushinteger(L, y); // 6. call my lua function lua_pcall(L, 2, 1, 0); // 7. get the return value of my lua function int ret = lua_tointeger(L, -1); // one top index of lua stack is -1 printf("result of lua func add(%d, %d) : %d\n", x, y, ret); //// second way to get the return value of my lua function //int n = lua_gettop(L); //int ret = lua_tointeger(L, n); // another top index of lua stack is the len of lua stack //printf("result of lua func add(%d, %d) : %d\n", x, y, ret); system("pause"); return 0; }
三. 完整的工程
下载完整的工程。
相关文章推荐
- lua学习(三)--------lua调用c++函数和简单的错误处理
- Lua学习之2 :Lua调用C++函数
- lua脚本语言的学习-----------------如何实现c++无参数的函数在lua中调用
- Lua学习笔记(6) : 在Lua中调用C++之函数
- 使用C++调用 LUA 函数收藏
- c++调用lua函数
- 简单C++调用lua函数及C++和lua相互函数调用小例子
- C/C++中调用LUA函数
- DELPHI中集成LUA脚本学习笔记2_调用LUA函数(详)
- c++学习笔记之函数的调用和返回
- 通过例子学习Lua(6) ---- C/C++中用Lua函数(转)
- 如何在c/c++中调用LUA函数
- 在Lua中调用c++函数示例
- Effective c++学习笔记——条款5:了解C++默默编写并调用哪些函数
- C++学习笔记(13)——利用对象、引用、指针调用虚函数
- 通过例子学习Lua(6)--C/C++中用Lua函数
- 通过例子学习Lua(6)----C/C++中用Lua函数
- C/C++中调用LUA函数(zz)
- C/C++中调用LUA函数
- tolua++绑定C/C++语言函数供lua调用