我在Lua中为TCP应用程序创建了一个Wireshark解剖器。我试图使用zlib压缩和base64解密。如何在Lua中实际创建或调用现有的c库?
我看到的文档只是说你可以获取库并使用require()
调用或luaopen_
调用,但不是如何实际使程序找到并识别实际的库。所有这些都是在Windows中完成的。
答案 0 :(得分:3)
你无法使用普通Lua加载任何现有的C库,而这些库不是为Lua创建的。它至少不是微不足道的。
*.so/*.dll
必须遵循某些特定标准,programming in Lua#26.2和lua-users wiki,code sample中直言不讳。类似的问题也回答here。
有两种方法可以解决您的问题:
zlib
库包装器。更大的列表@lua-users wiki
这同样适用于base64
编码/解码。唯一不同的是,已经有了普通的Lua库。代码示例和几个链接@lua-users wiki。
注意:Lua模块包管理器,如LuaRocks或 LuaDist 可能节省您充足的时间。
另外,简单地加载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。