将 lua 套接字添加到自带 lua 环境的程序 (bizhawk)
add luasocket to program (bizhawk) shipped with own lua environment
我正在尝试让 luasocket 在 Bizhawk, but so far without luck. I downloaded the vc8 version of luasocket here 的 lua 脚本环境中工作,确保我安装了 vc8,并检查了 lua 版本附带 bizhawk:5.1
但是,当我启动脚本时出现以下错误:
LuaInterface.LuaScriptException: error loading module 'socket.core' from file './libs/socket\core.dll':
Das angegebene Modul wurde nicht gefunden. (the given module was not found)
lua代码:
package.path = package.path..';./libs/lua/?.lua'
package.cpath = package.cpath..';./libs/?.dll'
local socket = require("socket")
文件系统结构:
libs
> lua
> socket
ftp.lua http.lua smtp.lua tp.lua url.lua
ltn12.lua
mime.lua
socket.lua
> socket
core.dll
> mime
core.dll
它似乎找到了文件,因为当我的文件结构错误时,它给了我实际的文件未找到错误。
我最好的猜测是,如果 Bizhawk 附带的 lua 与外部 lua 套接字库二进制文件之间存在某种不兼容性,但我没有想法。
我怀疑是因为对lua51.dll的依赖。 luasocket core.dll
库链接到 lua51.dll
(最有可能;您可以 运行 depends
或类似的工具来确定),这可能不存在,这可以防止 socket.core
正在加载。
即使你找到 lua51.dll
,如果 Bizhawk 是用 lua51.dll
静态编译的,它也不太可能工作,因为这将导致两个解释器加载到同一个进程中,这是 seg 的一个秘诀错误。
主要有三个选项,但它们都取决于 Bizhawk 项目的结构:
- Bizhawk 是针对
lua51.dll
编译的(并且此 dll 作为独立文件存在)。在这种情况下,您需要确保您正在使用的 socket/core.dll
是针对同一个库编译的并且它应该可以工作(只要 运行 时间相同并且 lua51.sll
是PATH
).
- Bizhawk 是用
lua51.dll
静态编译的。最简单的选择也是将 luasocket 库静态编译成可执行文件。
- 如果选项 2 不可用,则您需要使用代理库并从 Bizhawk 可执行文件中导出 Lua 符号,如此 SO 答案中所述:
如果 none 可以帮助您解决问题,您需要为您的 Windows 平台获取 depends
并在 "profiling" 模式,它将告诉您加载该 DLL 时发生的确切错误。
这家伙的设置:https://github.com/antogerva/emuHostUDP(解压缩到 emuhawk.exe 基本目录)。他的示例似乎有效,但它可能不包含您需要的所有内容。例如 HTTP。
由于项目很复杂并且 luasockets 示例很糟糕,这里有一个用于测试的单行代码 http:
print(require("socket.http").request{ url = "http://www.google.com" });
按照他的模式,我应用了以下方法: lua 目录的内容到根; lua5.1.dll root。请注意,我们不会使用 lua 套接字中的 core.dlls。这是因为 BizHawk 现在已经集成了它们;这对于解决 bizhawk 中 lua 套接字的错误是必要的。
更具体地说,我们有
- /emuhawk.exe
- /Lua(未改动)
- /Socket/ftp.lua,http.lua,等等
- /ltn12.lua,socket.lua,mime.lua
- /lua5.1.dll
- /mytest.lua
我不能说为什么所有这些都是必要的,但我认为它有效是奇迹,因为我们有一个 定制 lua。
在使用 lua 时,如果您发现一个可用的目录结构,最好不要再纠结了。
更新:
(可能已过时) 一旦你做了一些重要的事情,你可能会发现 bizhawk 崩溃。这似乎是由于与 luasocket 的 "protection" 系统发生冲突。检查 http.lua 并观察末尾的代码,它通过 socket.protect
发送一个函数来包装它。删除 socket.protect
包装器,它应该可以解决这个问题。
我正在尝试让 luasocket 在 Bizhawk, but so far without luck. I downloaded the vc8 version of luasocket here 的 lua 脚本环境中工作,确保我安装了 vc8,并检查了 lua 版本附带 bizhawk:5.1
但是,当我启动脚本时出现以下错误:
LuaInterface.LuaScriptException: error loading module 'socket.core' from file './libs/socket\core.dll':
Das angegebene Modul wurde nicht gefunden. (the given module was not found)
lua代码:
package.path = package.path..';./libs/lua/?.lua'
package.cpath = package.cpath..';./libs/?.dll'
local socket = require("socket")
文件系统结构:
libs
> lua
> socket
ftp.lua http.lua smtp.lua tp.lua url.lua
ltn12.lua
mime.lua
socket.lua
> socket
core.dll
> mime
core.dll
它似乎找到了文件,因为当我的文件结构错误时,它给了我实际的文件未找到错误。 我最好的猜测是,如果 Bizhawk 附带的 lua 与外部 lua 套接字库二进制文件之间存在某种不兼容性,但我没有想法。
我怀疑是因为对lua51.dll的依赖。 luasocket core.dll
库链接到 lua51.dll
(最有可能;您可以 运行 depends
或类似的工具来确定),这可能不存在,这可以防止 socket.core
正在加载。
即使你找到 lua51.dll
,如果 Bizhawk 是用 lua51.dll
静态编译的,它也不太可能工作,因为这将导致两个解释器加载到同一个进程中,这是 seg 的一个秘诀错误。
主要有三个选项,但它们都取决于 Bizhawk 项目的结构:
- Bizhawk 是针对
lua51.dll
编译的(并且此 dll 作为独立文件存在)。在这种情况下,您需要确保您正在使用的socket/core.dll
是针对同一个库编译的并且它应该可以工作(只要 运行 时间相同并且lua51.sll
是PATH
). - Bizhawk 是用
lua51.dll
静态编译的。最简单的选择也是将 luasocket 库静态编译成可执行文件。 - 如果选项 2 不可用,则您需要使用代理库并从 Bizhawk 可执行文件中导出 Lua 符号,如此 SO 答案中所述:
如果 none 可以帮助您解决问题,您需要为您的 Windows 平台获取 depends
并在 "profiling" 模式,它将告诉您加载该 DLL 时发生的确切错误。
这家伙的设置:https://github.com/antogerva/emuHostUDP(解压缩到 emuhawk.exe 基本目录)。他的示例似乎有效,但它可能不包含您需要的所有内容。例如 HTTP。
由于项目很复杂并且 luasockets 示例很糟糕,这里有一个用于测试的单行代码 http:
print(require("socket.http").request{ url = "http://www.google.com" });
按照他的模式,我应用了以下方法: lua 目录的内容到根; lua5.1.dll root。请注意,我们不会使用 lua 套接字中的 core.dlls。这是因为 BizHawk 现在已经集成了它们;这对于解决 bizhawk 中 lua 套接字的错误是必要的。
更具体地说,我们有
- /emuhawk.exe
- /Lua(未改动)
- /Socket/ftp.lua,http.lua,等等
- /ltn12.lua,socket.lua,mime.lua
- /lua5.1.dll
- /mytest.lua
我不能说为什么所有这些都是必要的,但我认为它有效是奇迹,因为我们有一个 定制 lua。
在使用 lua 时,如果您发现一个可用的目录结构,最好不要再纠结了。
更新:
(可能已过时) 一旦你做了一些重要的事情,你可能会发现 bizhawk 崩溃。这似乎是由于与 luasocket 的 "protection" 系统发生冲突。检查 http.lua 并观察末尾的代码,它通过 socket.protect
发送一个函数来包装它。删除 socket.protect
包装器,它应该可以解决这个问题。