lua 5.3.5 + luasocket 3.0-rc1 + luasec 0.8: DLL-библиотека WIN32 с несколькими экспортированными именами функций luaopen_xxx_xxx - PullRequest
1 голос
/ 15 июня 2019

Я использую Embarcadero C ++ Builder 10.1 32 бит на Windows 7 64 бит компьютер.Я компилирую все с 32-битной бесплатной версией Embarcadero IDE CB10.1.Я собрал 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.

Я запускаю lua из командной строки DOS, используя мой скомпилированный файл 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.h', используя 'options.lua', как требуется.Используя 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.Второе требование 'ssl.context' не выполняется с "модулем" 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.

Я не могу найти никаких указаний по этому вопросу.

1 Ответ

1 голос
/ 15 июня 2019

Как предложил @siffiejoe, не помещайте DLL в ssl\core.dll, а вместо этого сделайте ее доступной как ssl.dll. Первый вызов require работает случайно, потому что когда вам требуется ssl.core, Lua сопоставляет его с ssl\core (как одна из попыток), что отображает маску ....\?.dll в вашей переменной package.cpath на ....\ssl\core.dll и затем находит и вызывает luaopen_ssl_core в нем. Это перерывы для трех других звонков. Чтобы решить эту проблему, просто сделайте его доступным как ssl.dll.

...