将luasocket添加到自带lua环境附带的程序(bizhawk)中

时间:2015-10-30 03:51:58

标签: lua luasocket lua-5.1

我试图让luasocket在Bizhawk的lua脚本环境中工作,但到目前为止没有运气。我下载了lucaocket here的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库二进制文件之间存在不兼容性,那就有一些了,但我的想法不合适。

2 个答案:

答案 0 :(得分: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到root。请注意,我们不会使用luasockets中的core.dlls。这是因为 BizHawk现在将它们集成在一起;这对于解决bizhawk中luasockets的bug是必要的。

更具体地说,我们有

  • /emuhawk.exe
  • / Lua(未触动过)
  • /Socket/ftp.lua,http.lua,etc。
  • /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&#34;保护&#34;的冲突。系统。检查http.lua并观察最后的代码,该代码通过socket.protect发送一个函数来包装它。删除socket.protect包装器,它应该可以解决这个问题。

答案 1 :(得分:1)

我怀疑这是因为依赖于lua51.dll。 luasocket core.dll库与lua51.dll链接(最有可能;您可以运行depends或类似的工具以确定),这可能不存在,这会阻止socket.core从被装载。

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

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

  1. Bizhawk是针对lua51.dll编译的(此dll作为独立文件存在)。在这种情况下,您需要确保您使用的socket/core.dll是针对同一个库编译的,并且它应该有效(只要运行时间相同且lua51.sll可用于{{ 1}})。
  2. Bizhawk使用PATH进行静态编译。最简单的选项还是将luasocket库静态编译为可执行文件。
  3. 如果选项2不可用,那么您需要使用代理库并从Bizhawk可执行文件中导出Lua符号,如本答案中所述:https://stackoverflow.com/a/28310666/1442917
  4. 如果这些都无法帮助您解决问题,则需要为您的Windows平台获取lua51.dll并在“性能分析”模式下运行它,这将告诉您发生的确切错误DLL已加载。

相关问题