因为懒得写,所以源码是在这里拷贝过来的,

lua调用dll demo - ff_d - 博客园

这里讲一下配置开发的过程。

 上一讲提到了VS2019编译开发lua了,在编译好了之后,我们在这里使用一下。

首先新建一个dll工程,名字随便取,注意和后面的调用保持一致就OK了,我这里就叫“test_luaDll1”,源码内容如下,

//#include "pch.h"
//#include "msg.h"


//生成的dll  是   lua_add53.dll
//luaopen_lua_add
extern "C" {
#include "E:/wLua/luaVsProject/luaVsStaticLib/src/lua.h"
#include "E:/wLua/luaVsProject/luaVsStaticLib/src/lualib.h"
#include "E:/wLua/luaVsProject/luaVsStaticLib/src/lauxlib.h"
};

#pragma comment(lib, "E:/wLua/luaVsProject/x64/Debug/luaVsDll.lib")

#include <iostream>
using namespace std;

extern "C" int ShowMsg(lua_State * luaEnv) {
    cout << "Hello world from clibs!" << endl;
    return 0; // 返回值个数为0个.
}

extern "C" int sub2(lua_State * L)
{
    double op1 = luaL_checknumber(L, 1);
    double op2 = luaL_checknumber(L, 2);
    int temp = op1 - op2;
    lua_pushnumber(L, temp);
    return 1;
}

// part one: 要导出的函数列表
static luaL_Reg luaLibs[] = {
    { "ShowMsg", ShowMsg},
    { "sub2", sub2},
    { NULL, NULL }
};

// part two: DLL入口函数,Lua调用此DLL的入口函数.
extern "C" __declspec(dllexport)
int luaopen_test_luaDll1(lua_State * luaEnv) {
    //WinFeature是modole名, 将来require这个名字
    //lua_register(luaEnv, "ShowMsg", ShowMsg);  //关键一行, 在luaState上注册好这个lib
    //lua_register(luaEnv, "sub2", sub2);  //关键一行, 在luaState上注册好这个lib
    lua_newtable(luaEnv);
    luaL_setfuncs(luaEnv, luaLibs, 0);
    return 1;
}

编译后会生一个叫test_luaDll1.dll的文件,把这个文件和下面这个test.lua放在一起,

local mytest = require "test_luaDll1"
mytest.ShowMsg();
print(mytest.sub2(1,2));

如何使用lua

然后,运行指令

lua test.lua

运行完了你会看到下面的输出

Hello world from clibs!
-1.0

如图,

如何使用luac

关于luac的介绍这里有,

LUAC man page

简单地说,这个和python的pyc文件非常类似,就是把.lua文件变成二进制文件, 

E:\wLua\test_luaDll1\x64\Debug>luac test.lua

E:\wLua\test_luaDll1\x64\Debug>dir
2022/04/17  19:58    <DIR>          .
2022/04/17  19:58    <DIR>          ..
2022/04/17  19:58               182 luac.out
2022/04/17  19:51               182 test.exe
2022/04/17  18:50                82 test.lua
2022/04/17  19:49            66,560 test_luaDll1.dll
2022/04/17  19:49               756 test_luaDll1.exp
2022/04/17  19:49             1,900 test_luaDll1.lib
2022/04/17  19:49         1,527,808 test_luaDll1.pdb
               7 个文件      1,597,470 字节
               3 个目录 801,822,638,080 可用字节

E:\wLua\test_luaDll1\x64\Debug>lua luac.out
Hello world from clibs!
-1.0

从上面的运行结果可以看到,luac把test.lua变成了luac.out,这个是二进制格式的,然后通过lua.exe照样可以调用。当然,如果你希望生成的二进制文件名称有所不同,可以使用下面的指令、

luac -o myname.out  test.lua、

然后,就可以这样调用了,

lua myname.out

本文结束。