为Lua5.3编写C模块简单示例
为Lua5.3编写C模块简单示例
一、编译安装Lua5.3
MSVC 命令行安装脚本:
@echo off
md bin
md lib
md include
cd src cl /c /nologo /W3 /O2 /Ob1 /Oi /Gs /MD /D_CRT_SECURE_NO_DEPRECATE l*.c
ren lua.obj lua.o
ren luac.obj luac.o
lib /OUT:lua53.lib *.obj
copy lua53.lib ..\lib\lua53.lib
del *.o *.obj *.exp *.lib *.dll *.exe cl /c /nologo /W3 /O2 /Ob1 /Oi /Gs /MD /D_CRT_SECURE_NO_DEPRECATE /DLUA_BUILD_AS_DLL l*.c
ren lua.obj lua.o
ren luac.obj luac.o
link /DLL /IMPLIB:lua53.lib /OUT:lua53.dll *.obj
link /OUT:lua53.exe lua.o lua53.lib
link /OUT:luac53.exe luac.o *.obj
copy lua53.exp ..\bin\lua53.exp
copy lua53.lib ..\bin\lua53.lib
copy lua53.dll ..\bin\lua53.dll
copy lua53.exe ..\bin\lua53.exe
copy luac53.exe ..\bin\luac53.exe
del *.o *.obj *.exp *.lib *.dll *.exe copy lauxlib.h ..\include\lauxlib.h
copy lua.h ..\include\lua.h
copy lua.hpp ..\include\lua.hpp
copy luaconf.h ..\include\luaconf.h
copy lualib.h ..\include\lualib.h
cd ..\
打开vs开发人员命令提示,执行此脚本,进行编译。


生成的目录文件结构:

使用VS编写Lua的C模块时, VS的配置。




C模块mytest.h头文件源码:
/* Start of mytest.h */ #ifndef __MYTEST_H__
#define __MYTEST_H__ #ifdef __unix__ #define DllExport extern #else #define DllExport __declspec( dllexport ) #endif // __unix__ #ifdef __cplusplus #include <lua.hpp> #else extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
} #endif // __cplusplus #ifdef __cplusplus
extern "C" { // 告诉编译器以C的方式编译, 防止变量名称及函数名称粉碎问题
#endif // __cplusplus /* 此函数为C库中的“特殊函数", 在Windows系统中必须使用"__declspec( dllexport )"导出, 在类Unix上使用"extern"导出
* 通过调用它注册所有C库中的函数,并将它们存储在适当的位置。
* 此函数的命名规则应遵循:
* 1、使用"luaopen_"作为前缀。
* 2、前缀之后的名字将作为"require"的参数, 所以此名字必须和生成的dll同名否则找不到对应的库
*/
DllExport int luaopen_cl01(lua_State* L); #ifdef __cplusplus
} /* extern "C" */
#endif // __cplusplus #endif // __MYTEST_H__ /* End of mytest.h */
C模块mytest.c文件源码:
/* Start of mytest.c */ #include <stdio.h>
#include <math.h>
#include <stdarg.h>
#include <stdlib.h> #include "mytest.h" #ifdef __cplusplus
extern "C" { // 告诉编译器以C的方式编译, 防止变量名称及函数名称粉碎问题
#endif // __cplusplus /* 所有注册给Lua的C函数具有
* "typedef int (*lua_CFunction) (lua_State *L);"的原型。
*/
static int l_sin(lua_State *L)
{
// 如果给定虚拟栈中索引处的元素可以转换为数字,则返回转换后的数字,否则报错。
double d = luaL_checknumber(L, );
lua_pushnumber(L, sin(d)); /* push result */ /* 这里可以看出,C可以返回给Lua多个结果,
* 通过多次调用lua_push*(),之后return返回结果的数量。
*/
return ; /* number of results */
} /* 需要一个"luaL_Reg"类型的结构体,其中每一个元素对应一个提供给Lua的函数。
* 每一个元素中包含此函数在Lua中的名字,以及该函数在C库中的函数指针。
* 最后一个元素为“哨兵元素”(两个"NULL"),用于告诉Lua没有其他的函数需要注册。
*/
static const struct luaL_Reg cl01[] = {
{"mysin", l_sin},
{NULL, NULL}
}; /* 此函数为C库中的“特殊函数", 在Windows系统中必须使用"__declspec( dllexport )"导出, 在类Unix上使用"extern"导出
* 通过调用它注册所有C库中的函数,并将它们存储在适当的位置。
* 此函数的命名规则应遵循:
* 1、使用"luaopen_"作为前缀。
* 2、前缀之后的名字将作为"require"的参数, 所以此名字必须和生成的dll同名否则找不到对应的库
*/
DllExport int luaopen_cl01(lua_State* L)
{
/* void luaL_newlib (lua_State *L, const luaL_Reg l[]);
* 创建一个新的"table",并将"l"中所列出的函数注册为"table"的域。
*/
luaL_newlib(L, cl01); return ;
} #ifdef __cplusplus
} /* extern "C" */
#endif // __cplusplus /* End of mytest.c */
点击生成,产生以下文件

我们只需要将 cl01.dll 文件,拷贝到Lua的工作目录下即可。

LuaFile1.lua 文件源码:
--region LuaFile1.lua
--Date
--此文件由[BabeLua]插件自动生成 io.write(string.format("-------->>> %s <<<--------\n", "testing ...")) -- 此函数不会自动换行
local cl01lib = require("cl01")
print("mysin(3.14 /2) result: ", cl01lib.mysin(3.14 /)) -- 通过调用控制台命令行使程序暂停
-- os.execute("pause") --endregion
运行结果现象:


为Lua5.3编写C模块简单示例的更多相关文章
- VB.NET中的DLL编写和调用的最简单示例
DLL(动态链接库)是一个很有用的东西,在开发大项目的时候显得非常重要,因为多人合作开发时,可以给每个人分配一个任务,用DLL完成,最后组合起来,就不会出现互相冲突的问题.这里给出最简单的DLL编写与 ...
- Linux驱动学习(编写一个最简单的模块)
在Linux中想做驱动开发,那么一定要先熟悉module的使用和编写 一.什么是module 从名字上看就是模块的意思,我个人的理解就是一个一个的小程序,可以进行动态的安装和卸载,而在这里面就实现一些 ...
- 【转】PowerShell入门(十一):编写脚本模块
转至:http://www.cnblogs.com/ceachy/archive/2013/03/08/PowerShell_Script_Module.html 现在通过编写模块就可以在PowerS ...
- web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例
Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...
- python psutil简单示例
python psutil简单示例 利用psutil编写简单的检测小脚本 0.安装psutil模块 ...
- amaze ui各个模块简单说明
amaze ui各个模块简单说明 导航添加依据 http://amazeui.org/css/ 下面内容属学习笔记,如有理解偏差和错误请留言相告,感谢!* =(官网这块写的很详细) 一.基本样式 1 ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- 用Perl编写Apache模块续二 - SVN动态鉴权实现SVNAuth 禅道版
代码地址:https://code.csdn.net/x3dcn/svnauth 以禅道项目管理系统的数据库结构为标准,实现了可用的svn authz验证功能. 以用户名.密码.项目的acl开发程度o ...
- Mybatis的简单示例
首先新建一个JavaWeb项目并导入mybatis依赖的jar包,同时Mybatis是对数据库的操作所以我们需要在数据库中新建一个表user用来演示. 新建完表之后我们还需要建立相对应的实体类User ...
随机推荐
- windows10 下安装node失败 出现2502 2503的解决办法
下载node出现以下异常 : the install has encountered an unexpected errer installing this package.this may i ...
- Maven仓库搜索jar包依赖网址
可在该网站搜索jar包依赖 http://search.maven.org/
- 我的第一个python web开发框架(3)——怎么开始?
小白与小美公司经过几次接触商谈,好不容易将外包签订了下来,准备开始大干一场.不过小白由于没有太多的项目经验,学过python懂得python的基本语法,在公司跟着大家做过简单功能,另外还会一些HTML ...
- java枚举类(enum) 基础知识讲解
枚举类是在java 5后新增的,可以用于封装常量,并且还可以为常量的使用提供一些方法. 定义枚举类的语法: public enum EnumName{ 成员1(A,B...),成员2(A,B...), ...
- 使用LayUI操作数据表格
接着 上一篇 继续完善我们的demo,这次我们加一个搜索按钮 搜索 在table标签的上方,加入这样一组html <div class="demoTable"> 搜索商 ...
- 利用python多线程实现多个客户端与单个服务端的远程ssh
本次实验设计两个方面的代码,第一个是客户端,代码如下: import os from socket import * c = socket(AF_INET,SOCK_STREAM) c.connect ...
- Spring Boot-------JPA——EntityManager构建通用DAO
EntityManager EntityManager 是用来对实体Bean 进行操作的辅助类.他可以用来产生/删除持久化的实体Bean,通过主键查找实体bean,也可以通过EJB3 QL 语言查找满 ...
- 高德地图测两点距离android比较精确的
/////参考资料:高德官方:[http://lbs.amap.com/api/android-location-sdk/guide/android-location/getlocation] 主要三 ...
- MVVM前后分离轻量级框架应用juicer和doT.js
前言 前后端开发分的越来越细化,为了方便前端工程师更好的调试后端工程师嵌套的代码,前后分离技术就出现了,简单理解其实就是Ajax异步将数据提供给JavaScript,由JavaScript进 ...
- Python之scrapy安装
1.按照网上教程一步步实验,运行时报错: 'HtmlResponse' object has no attribute 'xpath' in scrapy 个人使用的是scrapy0.14.4,搜索得 ...