为Lua5.2.2编写C模块

本文的环境是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在同一个文件夹下,运行如下:


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

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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值