lua 5.3.5 + luasocket 3.0-rc1 + luasec 0.8 : WIN32 DLL with multiple luaopen_xxx_xxx exported function names

我正在使用在Windows 7 64位计算机上的Embarcadero C++Builder 10.1 32位。我使用Embarcadero IDE的CB10.1 32位免费版本编译所有内容。我已经将lua 5.3.5编译为dll。然后我将lua.c编译为DOS可执行文件lua.exe(使用lua dll),它似乎可以正确运行。我编译了luasocket 3.0rc1到2个dll(socket和mime)。

将luasocket脚本(ltn12.lua、mbox.lua、mime.lua和socket.lua)放置在“lua”文件夹中。剩余的luasocket脚本('ftp.lua','headers.lua','http.lua','smtp.lua','tp.lua'和'url.lua')放置在“socket文件夹中。'socket.dll'重命名为“core.dll”并放置在“socket”文件夹中。'mime.dll'重命名为'core.dll'并放置在'mime'文件夹中。

我从DOS提示运行lua,使用我的编译lua.c + dll。我可以正确地进行http / ftp / smtp请求。lua似乎能够正确找到所有的luasocket core.dll和\ * .lua脚本。

但是当我请求使用https的网页时,当lua尝试加载'https.lua'时,会提示找不到模块的错误。

因此,我正在尝试编译和安装luaSec 0.8和OpenSSL 1.0.2s。

我想将luaSec编译为WIN32 dll。我能够做到这一点。我使用“options.lua”创建了一个新的“options.h”。使用一个DLL依赖程序(Dependency Walker 2.2),我看到四个从dll导出的函数:

    luaopen_ssl_config
    luaopen_ssl_context
    luaopen_ssl_core
    luaopen_ssl_x509

将dll重命名为core.dll并放置在“ssl”文件夹中。'https.lua'从luaSec分发中放置在'ssl'文件夹中,并将'ssl.lua'放置在'lua'文件夹中。

然后:

我的lua脚本需要luasocket:

local url = require("socket.url")
local http = require("socket.http")

luasocket(在http.lua中)需要luaSec:

local https = assert(require("ssl.https"),'LuaSocket: LuaSec not found')

然后luaSec(在https.lua中)需要:

local ssl    = require("ssl")

然后luaSec(在ssl.lua中)需要:

local core    = require("ssl.core")
local context = require("ssl.context")
local x509    = require("ssl.x509")
local config  = require("ssl.config")

'ssl.core'的第一个require起作用。第二个'require' 'ssl.context'失败,显示“module' ssl.context' not found”。

如果我将luaSec编译为四个dll(core.dll,context.dll,x509.dll和config.dll),使得每个dll只有一个导出函数,并且该函数名称与require语句相匹配,则https请求将起作用。

我不清楚lua如何查找'core.dll'中的luaopen_ssl_x509、luaopen_ssl_context和luaopen_ssl_config。也许lua require()函数只支持每个dll一个导出函数。

我找不到任何关于这个的指导。

点赞
用户1442917
用户1442917

如@siffiejoe所建议的,不要将DLL放到ssl\core.dll中,而是将其作为ssl.dll可用。第一个require调用只是一种偶然的情况,因为当你需要ssl.core时,Lua将其映射到ssl\core(作为尝试之一),这将package.cpath变量中的....\?.dll掩码映射到....\ssl\core.dll,然后在其中找到并调用luaopen_ssl_core。对于其他三个调用,则会出现问题。要解决此问题,只需将其作为ssl.dll提供即可。

2019-06-15 02:13:57