0、前言
由于系统架构的原因,需要在windows下用lua调用c模块。下面是从网上收集的资料,整理所得。项目测试中,可用!如果不可用,可以差评的哦。
windows环境使用win10系统,其他系统没有测试过; lua版本采用lua5.1.4。测试过程中,我使用的源码编译得到lua相关的文件; 推荐一款工具viewdll.exe,它可以辅助检查dll库中的函数是否导出
1、下面是add.c文件(稍后会编译成dll)
#include "stdio.h"
#include "windows.h"
#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
);
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