lua调用c模块

    xiaoxiao2026-04-12  7

    0、前言

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

    windows环境使用win10系统,其他系统没有测试过; lua版本采用lua5.1.4。测试过程中,我使用的源码编译得到lua相关的文件; 推荐一款工具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")

    6、整个工程目录

    转载请注明原文地址: https://ju.6miu.com/read-1308764.html
    最新回复(0)