首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >添加luasocket到程序(bizhawk),自带lua环境

添加luasocket到程序(bizhawk),自带lua环境
EN

Stack Overflow用户
提问于 2015-10-30 03:51:58
回答 2查看 2.6K关注 0票数 4

我试图让luasocket在比兹霍克的lua脚本环境中工作,但到目前为止还没有成功。我下载了luasocket 这里这里版本,确保安装了vc8,并检查了bizhawk: 5.1附带的lua版本。

但是,当我启动脚本时,我会得到以下错误:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
package.path = package.path..';./libs/lua/?.lua'
package.cpath = package.cpath..';./libs/?.dll'
local socket = require("socket")

文件系统结构:

代码语言:javascript
复制
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库二进制文件之间存在某种不兼容,但我没有任何想法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-02 07:07:22

这个家伙已经设置好了:https://github.com/antogerva/emuHostUDP (解压缩到emuhawk.exe基本目录)。他的例子似乎奏效了,但它可能并不包含你所需要的一切。比如HTTP。

由于项目很复杂,而且luasocket示例很糟糕,所以这里有一个用于测试http的一行程序:

代码语言:javascript
复制
print(require("socket.http").request{ url = "http://www.google.com" });

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

更具体地说,我们有

  • /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时,如果您找到了一个可以工作的目录结构,最好不要再纠缠它了。

Update:(可能过时了)一旦您做了一些重要的事情,您可能会发现bizhawk崩溃了。这似乎是由于与luasocket的“保护”制度相冲突。检查http.lua并观察最后的代码,它通过socket.protect发送一个函数来包装它。移除socket.protect包装器,它将解决这个问题。

票数 5
EN

Stack Overflow用户

发布于 2015-10-30 04:17:47

我怀疑这是因为对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.sllPATH中可用)。
  2. Bizhawk是用lua51.dll静态编译的。最简单的选择也是静态地将luasocket库编译到可执行文件中。
  3. 如果选项2不可用,则需要使用代理库并从Bizhawk可执行文件导出Lua符号,如下所示:https://stackoverflow.com/a/28310666/1442917

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33428382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档