我正在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(套接字和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”文件夹中。
我使用已编译的lua.c + dll从DOS提示符下运行lua。我可以正确发出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”文件夹中。 luaSec发行版中的“ https.lua”放置在“ 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”作品的第一个要求。第二个要求'ssl.context'失败,并显示“找不到模块'ssl.context'”。
如果我将luaSec编译为四个dll(core.dll,context.dll,x509.dll和config.dll),以使每个dll仅具有一个导出函数,并且该函数名与require语句匹配,则https请求起作用。
我不清楚lua应该如何在luaopen_ssl_x509,luaopen_ssl_context和luaopen_ssl_config的“ core.dll”中查找。也许lua require()函数仅不支持每个dll导出多个函数。
在任何地方我都找不到任何指导。
答案 0 :(得分:1)
如@siffiejoe所建议,请勿将DLL放入ssl\core.dll
中,而应将其作为ssl.dll
使用。第一个require
调用是偶然发生的,因为当您需要ssl.core
时,Lua会将其映射到ssl\core
(作为尝试之一),这会在您的{中映射....\?.dll
掩码将{1}}变量设置为package.cpath
,然后在其中查找并调用....\ssl\core.dll
。这打破了其他三个电话。要解决此问题,只需将其作为ssl.dll即可使用。