搭建Lua5.2.2并编写C模块

来源:互联网 发布:淘宝店铺是怎么升级的 编辑:程序博客网 时间:2024/06/05 21:53

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中发生加载错误,

其错误待会为193-ERROR_BAD_EXE_FORMAT,不知为什么,留着以后调试吧。

8.将LuaCons工程的类型从dll改回生成应用程序的形式。生成即可。

9.尝试加载刚刚写的C模块,假如mylib.dll和LuaCons.exe在同一个文件夹下,运行如下:

image

假如mylib.dll和LuaCons.exe不在同一个文件夹下,只需要修改package.cpath即可,比如mylib.dll在D:\Lib中只需要在require之前添加

package.cpath = package.cpath .. “;D:\\Lib\\?.dll”即可。

后记,关于Lua的更多的知识,我还需要多多学习,开始时也是错误多多,后面跟着程序调试就好了。Play Happy!~

原文:http://my.oschina.net/u/146803/blog/126772

原创粉丝点击