1.官网上下载lua5.2.2,解压。
2.新建vs2010空工程比如命名lua522,并且将lua5.22中的所有头文件和源文件添加。先剔除luac.c该源文件。
3.编译生成lua522.exe即可,将程序生成路径比如xxx\Debug,添加进Path系统变量中。
4.启动cmd,键入lua522 -v即可得到lua版本信息,表示成功。
后记:如果想生成lua522.dll文件,将luac.c添加,并且剔除lua.c,将vs中的常规->配置类型改为动态库即可。
配置编辑环境Editplus:
1.工具->配置用户工具,将Group 1重命名为Lua,点击添加工具。
2.在Menu text中填写Running Lua,在Command该行将lua522.exe的路径添加上比如D:\xxx\lua522.exe
3.在Argument中填写$(FileName), 在Initial中填写$(FileDir),ok即可。
下面来配置Editplus的高亮语法。
4.editplus官网中http://www.editplus.com/others.html下载Lua 5.1 stx语法高亮文件,并解压。
5.在配置用户工具中,File->Setting&syntax添加文件类型lua,语法文件中找到lua51.stx路径并填写比如D:\xxx\lua51.stx
6.任意建立一个txt文件命名为template.lua,在File->Templates中点击添加,将该模板文件路径写上比如D:\xxx\template.lua
并且在Menu text项中命名为Lua即可。
现在来验证一下配置:
新建lua文件,键入代码print(“hello, world”) 点击工具->User Tool Group中的Lua,按下Ctrl+1,呵呵出现了控制台和hello,world
表示成功了。
本文的环境是win7和VS2010:
1.首先到官网下载lua5.2.2源码包,并且在VS2010上新建空工程比如命名LuaCons,将源码包中的头文件和源文件都添加进去。
2.需要生成lua的动态链接库,首先去掉源文件中的lua.c,并且在vs中的属性->常规->配置类型,修改为动态库(.dll),并且在
属性->C/C++->预处理器中,添加预定义LUA_COMPAT_ALL和LUA_BUILD_AS_DLL,当然这些预定义可以在luaconf.h中
开头定义好,不过我不怎么喜欢修改自带文件的方式。
3.右键生成,于是在Debug中可以看到生成的LuaCons.dll和LuaCons.lib。
4.新建C模块工程(怕麻烦就在同一个解决方案中即可)比如命名为mylib。在C/C++->常规->附加包含目录中填上指向解压后的src路径
比如相对路径../xxxx/src或者绝对路径D:/xxxx/src,在链接器->常规->附加库目录中填上直到刚才生成的动态库路径,
相对或者绝对的都可以比如D:/xxxx/Debug。在链接器->输入->附加依赖项中添加LuaCons.lib。
5.在模块工程中新建mylib.h和mylib.cpp文件,填上:
mylib.h文件:
#ifndef _MYLIB_H
#define _MYLIB_H extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}; extern "C" int __declspec(dllexport) luaopen_mylib(lua_State *L);
#endif //_MYLIB_H
由于使用C++编译器,所以lua的三个头文件需要以extern “C”扩起来。并且导出函数入口点必须是luaopen_xxx,
其中xxx就是要生成C模块(dll)库的名字。
mylib.cpp文件:
#include "mylib.h"
//说明:lua的交换栈,栈底部为1,向栈顶递增;也可认为栈顶部为-1,向栈底部递减
//演示返回多个参数
extern "C" static int l_mystr(lua_State *L)
{
lua_pushstring(L, "looyer");//返回的第一个参数, 字符串“looyer”
lua_pushnumber(L, 37);//返回的第二个参数,数字37 //返回第三个参数table = {['ac'] = 17, [2] = "bn"}
lua_newtable(L);//在栈顶创建一个table //方法一,设置table的键和值
lua_pushstring(L, "ac");
lua_pushnumber(L, 17);
lua_settable(L, -3);//在table中设置键值对['ac'] = 17, 设置后,自动pop掉栈顶的两个元素 //方法二,设置table的键和值
lua_pushstring(L, "bn");
lua_setfield(L, -2, "2");//将栈顶元素设置为键“2”的值,并且赋个索引为-2的栈中table return 3;//返回参数的个数
} //演示输入多个参数,检查输入一个数字,一个字符串,一个table
extern "C" static int l_myadd(lua_State *L)
{
int a = luaL_checknumber(L, 1);
const char *p = luaL_checkstring(L, 2);
lua_getfield(L, 3, "yt");//将第三个参数table的“yt”键的值压入栈
int b = luaL_checknumber(L, -1);//取出该“yt”键的值
lua_pushnumber(L, a + b);
return 1;//返回一个参数
} static const struct luaL_Reg mylib[] =
{
{"mystr", l_mystr},
{"inadd", l_myadd},
{NULL, NULL}
}; int luaopen_mylib(lua_State *L)
{
luaL_newlib(L, mylib);
return 1;
}
6.点击生成,即可看到Debug库中生成了mylib.dll和mylib.lib,我们只需要mylib.dll即可。
7.在lua中调用我们写好的dll模块,首先在LuaCons工程中添加刚刚移除的lua.c文件,然后移除luac.c文件,记住不要去掉刚才定义的两个宏,
否则待会在lua中加载会失败,特别是去掉LUA_BUILD_AS_DLL会在loadlib.c中的ll_load函数中的WIN32函数LoadLibraryExA中发生加载错误,
ERROR_BAD_EXE_FORMAT,不知为什么,留着以后调试吧。
8.将LuaCons工程的类型从dll改回生成应用程序的形式。生成即可。
9.尝试加载刚刚写的C模块,假如mylib.dll和LuaCons.exe在同一个文件夹下,运行如下:
假如mylib.dll和LuaCons.exe不在同一个文件夹下,只需要修改package.cpath即可,比如mylib.dll在D:\Lib中只需要在require之前添加
package.cpath = package.cpath .. “;D:\\Lib\\?.dll”即可。