local socket = require("socket"), module 'socket' not found(无法找到 socket 模块)

我正在使用 Visual Studio 2015 中的 Lua 和 C++ 进行项目开发。我使用 Luarocks 创建了 socket/core.dll 和 mime/core.dll。我将 core.dll 添加到了我的 C++程序执行的 debug 文件夹中。当“require("socket")”执行时,我在 lua 中遇到了以下错误:

...s\Visual Studio 2015\Projects\RaceGame3\Debug\Client.lua:17: 无法找
到模块 'socket':
    没有找到 package.preload['socket']
    没有找到文件 'C:\Users\Username\Documen
ts\Visual Studio 2015\Projects\RaceGame3\Debug\lua\socket.lua'
    没有找到文件 'C:\Users\Username\Documen
ts\Visual Studio 2015\Projects\RaceGame3\Debug\lua\socket\init.lua'
    没有找到文件 'C:\Users\Username\Documen
ts\Visual Studio 2015\Projects\RaceGame3\Debug\socket.lua'
    没有找到文件 'C:\Users\Username\Documen
ts\Visual Studio 2015\Projects\RaceGame3\Debug\socket\init.lua'
    没有找到文件 'C:\Users\Username\Documen
ts\Visual Studio 2015\Projects\RaceGame3\Debug\..\share\lua\5.3\socket.lua'
    没有找到文件 'C:\Users\Username\Documen
ts\Visual Studio 2015\Projects\RaceGame3\Debug\..\share\lua\5.3\socket\init.lua'
    没有找到文件 '.\socket.lua'
    没有找到文件 '.\socket\init.lua'
    没有找到文件 'C:\Users\Username\Documen
ts\Visual Studio 2015\Projects\RaceGame3\Debug\socket.dll'
    没有找到文件 'C:\Users\Username\Documen
ts\Visual Studio 2015\Projects\RaceGame3\Debug\..\lib\lua\5.3\socket.dll'
    没有找到文件 'C:\Users\Username\Documen
ts\Visual Studio 2015\Projects\RaceGame3\Debug\loadall.dll'
    没有找到文件 '.\socket.dll'

因此,总的来说:在运行 C++ 项目时,我应该如何正确地将 core.dll 或其他 luasocket 文件链接到当前的 Lua 实例中?

点赞
用户5496529
用户5496529

我曾通过更改require来解决类似问题:

require("socket.core")

当然,这仅在core.dll在名为socket的文件夹中时才起作用,可在本地或PATH/package.cpath等中找到。

您还可以将core.dll重命名为socket.dll(并将其放置在可搜索的文件夹中)。

就我所知,问题是:所需名称和实际dll名称不匹配。

编辑:为了保险起见,我将lua模块和dll放在一起,像这样:

socket
├── core.dll
├── ltn12.lua
├── mime.lua
├── mime-1.0.3.dll
├── socket
│   ├── ftp.lua
│   ├── headers.lua
│   ├── http.lua
│   ├── smtp.lua
│   ├── tp.lua
│   └── url.lua
└── socket.lua
2017-12-30 15:49:31
用户2673809
用户2673809

你的情况和我很相似,在sample.lua中,我需要引入socket.http

require("socket.http")
content, status, header = socket.http.request("http://website.com/aaa.php")

但遇到了以下错误消息:

...\MyProject\Release\sample.lua:1: module 'socket.http' not found:
    no field package.preload['socket.http']
    no file '.\socket\http.lua'
    (...)

我解决了这个问题,将一些必要的lua脚本和dll文件放在一个示例可执行文件的路径下。

Release
├── socket
│   ├── ftp.lua
│   ├── http.lua
│   ├── smtp.lua
│   ├── tp.lua
│   └── url.lua
├── mime
│   └── core.dll
├── ltn12.lua
├── mime.lua
├── socket.dll    <--- 从$(LUA_PATH)\clibs\socket\core.dll重命名而来
├── socket.lua
├── lua5.1.dll
├── sample.exe
└── sample.lua

cpp代码如下:

#pragma comment(lib, "lua5.1.lib")
#include <lua.hpp>
void main() {
    lua_State *L = luaL_newstate();
    luaL_openlibs(L);
    luaL_dofile(L, "sample.lua");
    lua_close(L);
}
2018-04-12 04:37:03