lua调用c模块

0、前言

由于系统架构的原因,需要在windows下用lua调用c模块。下面是从网上收集的资料,整理所得。项目测试中,可用!如果不可用,可以差评的哦。

  1. windows环境使用win10系统,其他系统没有测试过;
  2. lua版本采用lua5.1.4。测试过程中,我使用的源码编译得到lua相关的文件;
  3. 推荐一款工具viewdll.exe,它可以辅助检查dll库中的函数是否导出


1、下面是add.c文件(稍后会编译成dll)

#include "stdio.h"
#include "windows.h" 
//用vs2012 x86本机工具命令行编译

#ifdef   _cplusplus  
extern "C"{
    #endif
    #include "lua.h"
    #include "lauxlib.h"
    #include "lualib.h"

    extern  int  isquare(lua_State *L);
    extern  int  alert(lua_State *L);
    #ifdef _cplusplus
}
#endif

int luaopen_add(lua_State *L){
    lua_register(
            L,              
            "square",       
            isquare   
            );  
    //L是句柄, "alert"是设置的全局新名字, alert是函数指针
    lua_register(L,"alert",alert);
    return 0;
}

//弹框
int alert(lua_State *L)
{
    const char * desc = lua_tostring(L,-1);
    MessageBox(NULL,desc,"alert",MB_OK);
    return 1;
}

//平方
int isquare(lua_State *L){                
    float rtrn = lua_tonumber(L, -1);      
    lua_pushnumber(L,rtrn*rtrn);          
    return 1;                             
}


2、把add.c编译成目标文件,即add.obj

cl /c add.c /I ./include
说明:include文件夹中放置的是lauxlib.h、lua.h、lua.hpp、luaconf.h、luajit.h和lualib.h等头文件

3、导出函数到dll,使其对外可见。下面是文件export.def

; export.def
LIBRARY ADD

; MY_DLLMAIN 将成为生成的dll的名称
DESCRIPTION ‘test’

EXPORTS
isquare @ 1
alert @ 2
; 这个名称即为函数的实际导出名称 @1为函数的导出编号

4、把add.obj链接成dll库

link /def:export.def /dll add.obj ./lua5.1.4.lib "kernel32.lib" "user32.lib" "gdi32.lib"
说明:其中lua51.lib我是由源码生成的,export.def是刚才手写的,其他都是windows系统自带的。

5、app.lua是测试文件,用它来调用dll库

square = package.loadlib("add.dll", "isquare")

alert = package.loadlib("add.dll", "alert")
print(alert)
print ( square(2) )
alert("222")

lua调用c演示demo

6、整个工程目录

整个工程目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值