3

我试图让 luasocket 在 Bizhawk 的 lua 脚本环境中工作,但到目前为止还没有运气。我在这里下载了 luasocket 的 vc8 版本,确保我已经安装了 vc8,并检查了 bizhawk 附带的 lua 版本: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 与外部 luasocket 库二进制文件之间存在某种不兼容,但我没有想法。

4

2 回答 2

4

这个人已经设置好了:https ://github.com/antogerva/emuHostUDP (解压到 emuhawk.exe 基本目录)。他的示例似乎有效,但它可能不包含您需要的所有内容。以 HTTP 为例。

由于项目很复杂而且 luasockets 的例子很糟糕,这里有一个用于测试 http 的单行代码:

print(require("socket.http").request{ url = "http://www.google.com" });

按照他的模型,我应用了以下方法: lua dir 的内容到 root;lua5.1.dll 到根目录。请注意,我们不会使用来自 luasockets 的 core.dll。这是因为BizHawk 现在已经集成了它们;这对于解决 bizhawk 中的 luasockets 错误是必要的。

更具体地说,我们有

  • /emuhawk.exe
  • /Lua(未改动)
  • /Socket/ftp.lua、http.lua等
  • /ltn12.lua,socket.lua,mime.lua
  • /lua5.1.dll
  • /mytest.lua

(来自http://files.luaforge.net/releases/luasocket/luasocket/luasocket-2.0.2/luasocket-2.0.2-lua-5.1.2-Win32-vc8.zip的文件)

我不能说为什么所有这些都是必要的,但我认为它的工作原理很神奇,因为我们有一个定制的lua。

在使用 lua 时,如果你找到一个可以工作的目录结构,最好不要再纠结了。

更新:( 可能已经过时)一旦你做了一些不平凡的事情,你可能会发现 bizhawk 崩溃。这似乎是由于与 luasocket 的“保护”系统发生冲突。检查 http.lua 并观察最后发送函数socket.protect以包装它的代码。去掉socket.protect包装,它应该可以解决这个问题。

于 2015-11-02T07:07:22.243 回答
1

我怀疑这是因为对 lua51.dll 的依赖。luasocketcore.dll库被链接到lua51.dll(很可能;你可以运行depends或类似的工具来确定),这可能不存在,这会阻止socket.core加载。

即使你发现lua51.dll,如果 Bizhawk 是静态编译的,它也不太可能工作,lua51.dll因为这会导致两个解释器加载到同一个进程中,这是 seg 错误的一个原因。

有三个主要选项,但它们都取决于 Bizhawk 项目的结构:

  1. Bizhawk 是针对编译的lua51.dll(并且此 dll 作为独立文件存在)。在这种情况下,您需要确保socket/core.dll您使用的是针对同一个库编译的并且它应该可以工作(只要运行时相同并且lua51.sll在 中可用PATH)。
  2. Bizhawk 使用lua51.dll. 最简单的选择也是将 luasocket 库静态编译到可执行文件中。
  3. 如果选项 2 不可用,那么您需要使用代理库并从 Bizhawk 可执行文件中导出 Lua 符号,如此 SO 答案中所述:https ://stackoverflow.com/a/28310666/1442917

如果这些都不能帮助您解决问题,您需要depends为您的 Windows 平台获取并在“分析”模式下运行它,这将告诉您加载该 DLL 时发生的确切错误。

于 2015-10-30T04:17:47.700 回答