在Lua呼叫图书馆

时间:2014-03-17 15:15:56

标签: lua

我在Lua中为TCP应用程序创建了一个Wireshark解剖器。我试图使用zlib压缩和base64解密。如何在Lua中实际创建或调用现有的c库?

我看到的文档只是说你可以获取库并使用require()调用或luaopen_调用,但不是如何实际使程序找到并识别实际的库。所有这些都是在Windows中完成的。

3 个答案:

答案 0 :(得分:3)

无法使用普通Lua加载任何现有的C库,而这些库不是为Lua创建的。它至少不是微不足道的。

*.so/*.dll必须遵循某些特定标准,programming in Lua#26.2lua-users wikicode sample中直言不讳。类似的问题也回答here

有两种方法可以解决您的问题:

  1. 按照这些标准编写自己的Lua zlib库包装器。
  2. 采取一些已经完成的解决方案:
  3. FFI
  4. 更大的列表@lua-users wiki

    这同样适用于base64编码/解码。唯一不同的是,已经有了普通的Lua库。代码示例和几个链接@lua-users wiki

    注意:Lua模块包管理器,如LuaRocksLuaDist 可能节省您充足的时间。

    另外,简单地加载Lua模块通常由一行组成:

    local zlib = require("zlib")
    

    将在您的Lua口译员luaconf.h文件中定义的位置搜索该模块。

    对于5.1它:

    #if defined(_WIN32)
    /*
    ** In Windows, any exclamation mark ('!') in the path is replaced by the
    ** path of the directory of the executable file of the current process.
    */
    #define LUA_LDIR        "!\\lua\\"
    #define LUA_CDIR        "!\\"
    #define LUA_PATH_DEFAULT  \
                ".\\?.lua;"  LUA_LDIR"?.lua;"  LUA_LDIR"?\\init.lua;" \
                             LUA_CDIR"?.lua;"  LUA_CDIR"?\\init.lua"
    #define LUA_CPATH_DEFAULT \
        ".\\?.dll;"  LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll"
    
    #else
    

答案 1 :(得分:1)

  

如何在Lua中实际创建或调用现有的c库?

一个任意的库,不是为Lua使用而编写的?你通常不能。

Lua耗材"模块"必须链接到Lua API - 与主机解释器相同的版本,例如Wireshark目录根目录中的Lua5.1.dll - 并公开与lua_CFunction签名匹配的C可调用函数。 Lua可以加载库并调用该函数,并且它可以使用Lua API实际向Lua公开功能。

您的zlib和/或base64库对Lua一无所知。如果你有一个内置FFI的Lua解释器,或者你找到了一个可以加载的FFI Lua模块,你可能会让它工作,但它确实比它的价值更麻烦。编写一个Lua模块实际上非常简单,你可以为Lua定制界面更加惯用。

我没有方便的zlib或base64 C库,所以举个例子,我们想让我们的Lua脚本使用MessageBox中的user32.dll函数Windows中的库。

#include <windows.h>
#include "lauxlib.h"

static int luaMessageBox (lua_State* L) {
    const char* message = luaL_checkstring(L,1);
    MessageBox(NULL, message, "", MB_OK);
    return 0;
}

int __declspec(dllexport) __cdecl luaopen_messagebox (lua_State* L) {
    lua_register(L, "msgbox", luaMessageBox);
    return 0;
}

要构建此功能,我们需要链接user32.dll(包含MessageBox)和lua5.1.dll(包含Lua API)。您可以从Wireshark源获取Lua5.1.lib。这里使用Microsoft的编译器生成messagebox.dll

cl /LD /Ilua-5.1.4/src messagebox.c user32.lib lua5.1.lib

现在你的Lua脚本可以写:

require "messagebox"

msgbox("Hello, World!")

答案 2 :(得分:0)

您唯一的选择是使用像alien这样的库库。有关其他FFI库,请参阅我的答案Disabling Desktop Composition using Lua Scripting