将 luasocket 添加到预先装有自己的 Lua 环境的程序(bizhawk)中。
我正在尝试在 Bizhawk 的 lua 脚本环境中让 luasocket 正常工作,但到目前为止没有成功。我下载了 vc8 版本的 luasocket here,确保我已经安装了 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 库二进制文件之间存在某种不兼容性,但我已经没有更多的想法了。
这个人已经将它设置好了:https://github.com/antogerva/emuHostUDP (解压至emuhawk.exe基目录)。他的示例似乎可以工作,但可能没有包含你所需的一切。例如,HTTP。
由于项目比较复杂,而luasockets示例又很糟糕,因此以下是用于测试http的一行代码:
print(require(“socket.http”).request {url =“http://www.google.com”});
遵循他的模式,我应用了以下方法:将lua目录的内容移动到根目录中;将lua5.1.dll移动到根目录中。请注意,我们将不使用luasockets的core.dlls。这是因为_BizHawk已经将它们集成起来,而这是必要的,以解决在Bizhawk中使用luasockets时出现的Bug问题。
具体而言,我们有:
- /emuhawk.exe
- /Lua(未更改)
- /Socket/ftp.lua,http.lua等
- /ltn12.lua,socket.lua,mime.lua
- /lua5.1.dll
- /mytest.lua
我无法确定为什么需要所有这些,但我认为奇迹出现了,因为我们有一个定制的lua。
在使用lua时,如果发现一个有效的目录结构,最好不要再试图更改它。
更新:
(可能已过时) 一旦你做了些非常规操作,你可能会发现bizhawk崩溃。这似乎是由于与luasocket的“保护”系统冲突所致。检查http.lua并观察在末尾发送函数经过socket.protect包装的代码。移除socket.protect包装器应该可以解决这个问题。
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
我怀疑原因是 lua51.dll 的依赖性。Luasocket 的
core.dll库与lua51.dll(最可能;您可以运行depends或类似工具来确定)建立了连接,但可能不存在,这会阻止socket.core被加载。即使您找到了
lua51.dll,如果Bizhawk 静态编译了lua51.dll,它也不可能起作用,因为这将导致两个解释器加载到同一个进程中,这是一个seg faults的配方。有三个主要选项,但它们都取决于 Bizhawk 项目的结构:
lua51.dll编译的(并且该 DLL 作为独立文件存在)。在这种情况下,您需要确保您使用的socket/core.dll编译与相同的库,并且它应该工作(只要运行时相同并且lua51.sll在PATH中可用)。lua51.dll。最简单的选项也是将 luasocket 库静态编译到可执行文件中。如果这些都无法帮助您解决问题,您需要获取适用于 Windows 平台的
depends并在“分析”模式下运行它,这将告诉您在加载该 DLL 时发生的确切错误。