lua 5.3.5 + luasocket 3.0-rc1 + luasec 0.8 : 具有多个 luaopen_xxx_xxx 导出函数名称的 WIN32 DLL
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)。
lua套接字脚本(ltn12.lua、mbox.lua、mime.lua 和 socket.lua)位于 'lua' 文件夹中。其余 lua 套接字脚本('ftp.lua'、'headers.lua'、'http.lua'、'smtp.lua'、'tp.lua' 和 'url.lua')放在'套接字文件夹。 'socket.dll' 重命名为 'core.dll' 并放置在 'socket' 文件夹中。 'mime.dll' 重命名为 'core.dll' 并放置在 'mime' 文件夹中。
I 运行 lua 从 DOS 提示符使用我编译的 lua.c + dll。我可以正确地发出 http/ftp/smtp 请求。 lua 似乎能够正确找到所有 lua 套接字 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 脚本需要 lua 套接字:
local url = require("socket.url")
local http = require("socket.http")
lua套接字(在http.lua中)需要lua秒:
local https = assert(require("ssl.https"), 'LuaSocket: LuaSec not found')
然后lua秒(在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' 的第二个要求因 "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 多个导出函数。
我在任何地方都找不到这方面的任何指导。
正如@siffiejoe 建议的那样,不要将 DLL 放入 ssl\core.dll
,而是将其作为 ssl.dll
提供。第一个 require
调用是偶然工作的,因为当您需要 ssl.core
时,Lua 将其映射到 ssl\core
(作为其中一次尝试),后者映射 ....\?.dll
将 package.cpath
变量中的掩码设为 ....\ssl\core.dll
,然后在其中查找并调用 luaopen_ssl_core
。这会中断其他三个调用。要解决此问题,只需将其设为 ssl.dll.
我在 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)。
lua套接字脚本(ltn12.lua、mbox.lua、mime.lua 和 socket.lua)位于 'lua' 文件夹中。其余 lua 套接字脚本('ftp.lua'、'headers.lua'、'http.lua'、'smtp.lua'、'tp.lua' 和 'url.lua')放在'套接字文件夹。 'socket.dll' 重命名为 'core.dll' 并放置在 'socket' 文件夹中。 'mime.dll' 重命名为 'core.dll' 并放置在 'mime' 文件夹中。
I 运行 lua 从 DOS 提示符使用我编译的 lua.c + dll。我可以正确地发出 http/ftp/smtp 请求。 lua 似乎能够正确找到所有 lua 套接字 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 脚本需要 lua 套接字:
local url = require("socket.url")
local http = require("socket.http")
lua套接字(在http.lua中)需要lua秒:
local https = assert(require("ssl.https"), 'LuaSocket: LuaSec not found')
然后lua秒(在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' 的第二个要求因 "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 多个导出函数。
我在任何地方都找不到这方面的任何指导。
正如@siffiejoe 建议的那样,不要将 DLL 放入 ssl\core.dll
,而是将其作为 ssl.dll
提供。第一个 require
调用是偶然工作的,因为当您需要 ssl.core
时,Lua 将其映射到 ssl\core
(作为其中一次尝试),后者映射 ....\?.dll
将 package.cpath
变量中的掩码设为 ....\ssl\core.dll
,然后在其中查找并调用 luaopen_ssl_core
。这会中断其他三个调用。要解决此问题,只需将其设为 ssl.dll.