1、Lua开发工具(lua for windows)详解及其环境配置
Lua开发工具(lua for window)及其环境配置是本文要介绍的内容,主要是来了解并学习lua开发工具的使用和环境的配置.
lua for window 下载地址:http://luaforwindows.luaforge.net/
它包括:
Lua Interpreter(Lua解释器) Lua Reference Manual(Lua参考手册) Quick Lua Tour (Lua快速入门) Examples (Lua范例) Libraries with documentation (一些Lua库和文档) SciTE (一个很棒的多用途编辑器,已经对Lua做了特殊设置)下载后直接安装就可以使用了。
2、验证安装Lua开发环境
打开SciTE,新建一个文件,输入一行lua代码:
print("hello,lua")
然后保存为hello.lua,注意保存文件时要加文件名后缀.lua,否则可能不能正确的运行。
按F5,如果SciTE的输出窗口出现
>lua -e "io.stdout:setvbuf 'no'" "hello.lua"
hello,lua >Exit code: 0字样则代表整个lua开发环境安装成功。
2、eclipse
下载地址:
中的
3、visual studio中使用Lua
如果你是个C/C++程序员,用的是VS。本人用的是VS2008。
选择“Tools(工具)”-->“Options(选项)”-->“Projects and Solutions(项目和解决方案)”-->“VC++ Directories(C++目录)”。
(1)在右边的“Show Directories for(显示目录)”中的下拉菜单中选择“Include Files(包含文件)”,然后在下面添加一个新路径"C:\Program Files\lua\5.1\include"。
(2)在右边的“Show Directories for(显示目录)”中的下拉菜单中选择“Library Files(包含文件)”,然后在下面添加一个新路径"C:\Program Files\lua\5.1\lib“。
注意:C:\Program Files\lua是lua for windows 的安装路径
OK,VS的配置结束。
4、来试试我们第一个LUA应用。(用的是c++)
1)、创建一个新的空Win32控制台应用工程。
2)、将"luatest.cpp"加入你的工程。
3)、选择项目菜单中的属性菜单。
4)、在"连接器"的"输入"栏目的"附加依赖项"中输入"lua5.1.lib"。
5)、完成。
如何编写test.lua脚本文件? 如下:
print(“hello, lua!”)
如何编写luatest.cpp?如下:#include <stdio.h>
extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib.h" }/* Lua解释器指针 */
lua_State* L; int main ( int argc, char *argv[] ) { /* 初始化 Lua */ L = lua_open(); /* 载入Lua基本库 */ luaL_openlibs(L); /* 运行脚本 */ luaL_dofile(L, "test.lua的绝对路径"); /* 清除Lua */ lua_close(L); /* 暂停 */ printf( "Press enter to exit…" ); getchar(); return 0; }运行输出:
print ("hello, lua!")
学习笔记 二
1、Lua与c++交互之C++调用Lua
注意点: 1)、extern "C" 2)、luaL_openlibs(L) 3)、luaL_dofile(L, "test.lua")#include <stdio.h>
extern "C" {
#include "lua.h" #include "lualib.h" #include "lauxlib.h" }/* the Lua interpreter */
lua_State* L; int luaadd ( int x, int y ){ int sum;/* the function name */
lua_getglobal(L, "add");/* the first argument */
lua_pushnumber(L, x);/* the second argument */
lua_pushnumber(L, y);/* call the function with 2
arguments, return 1 result */ //说明调用的函数是带有2个参数和1个返回值 lua_call(L, 2, 1);/* get the result */
sum = (int)lua_tonumber(L, -1); lua_pop(L, 1);return sum;
}int main(int argc, char **argv)
{ int sum;/* initialize Lua */
L = lua_open(); luaopen_base(L);/* load Lua base libraries */
luaL_openlibs(L);/* load the script */
luaL_dofile(L, "script/test.lua");/* call the add function */
sum = luaadd( 10, 15 );/* print the result */
printf( "The sum is %d\n", sum );/* cleanup Lua */
lua_close(L);printf( "Press enter to exit…" );
getchar(); return 0;}2、Lua与c++交互之Lua调用C++
在lua中是以函数指针的形式调用函数, 并且所有的函数指针都必须满足如下此种类型:
typedef int (*lua_CFunction) (lua_State *L); 也就是说, 我们在C++中定义函数时必须以lua_State为参数, 以int为返回值才能被Lua所调用. 但是不要忘记了, lua_State是支持栈的, 所以通过栈可以传递无穷个参数, 大小只受内存大小限制. 而返回的int值也只是指返回值的个数.真正的返回值都存储在lua_State的栈中. 我们通常的做法是做一个wrapper, 把所有需要调用的函数都wrap一下, 这样就可以调用任意的函数了.注意点:
1)、lua中调用:get_sum(10, 20, 30, 40, 50,100);
2)、int get_sum(lua_State *L)
Lua是按照 __fastcall 的规则传递参数的,也就是从左到右一个个传。
Lua压栈的顺序是:首先将函数压栈,然后将参数压栈。执行完毕后,将参数和函数都出栈,然后将返回值按顺序压栈。3)、函数体编写完,将该函数进行注册 lua_register( L, "get_sum", get_sum);
#include <stdio.h>
extern "C" {
#include "lua.h" #include "lualib.h" #include "lauxlib.h" }/* the Lua interpreter */
lua_State* L;static int get_sum(lua_State *L)
{ //返回栈中元素的个数 int n = lua_gettop(L); double sum = 0; int i; for (i = 1; i <= n; i++) { if (!lua_isnumber(L, i)) { lua_pushstring(L, "Incorrect argument to 'sum'"); lua_error(L); } sum += lua_tonumber(L, i); } /* push the sum */ lua_pushnumber(L, sum); return 1;} int main(int argc, char **argv){ /* initialize Lua */ L = lua_open(); luaopen_base(L);/* load Lua base libraries */
luaL_openlibs(L);lua_register(L, "get_sum", get_sum);
/* load the script */ /*Lua01.lua是这个C++程序调用的Lua文件*/ luaL_dofile(L, "script/test.lua");/* print the result */
lua_getglobal(L,"sum"); printf("sum is: %d \n", lua_tointeger(L,-1));/* cleanup Lua */
lua_close(L); printf( "Press enter to exit…" ); getchar(); return 0;}