1

我对 Lua 很陌生,我对导入机制有一些问题。
从其他语言我习惯做这样的事情:

include "./lib/mylib.h"

或者通常只是将本地路径传递给我想要包含的文件。

现在在 Lua 中,我有点困惑。我读了一些关于require在 lua 路径中查找库的内容。
就我而言,我想创建一个使用 luasocket 库的脚本,但我想从本地路径导入它,这样我就可以部署它,而无需将它放在 lua 路径中的另一台机器上。

从其他论坛我得到了一些解决方案,比如创建一个local在给定的本地库文件夹中查找的 require 函数,但这不起作用。

然后我读到我可以只键入require 'myfile'在本地导入不同的文件,但 luasocket 需要一个 core.dll,如果我只是将库的 lua 文件移动到我的本地路径,它就找不到 dll。

有没有简单的方法来解决这个问题。我该怎么做才能让它工作?

4

1 回答 1

1

.dll 扩展名在 中就足够了LUA_CPATH(所以它最终在 中package.cpath)。例如,放入socket.lua,C:\Foo并放入core.dll同一个文件夹。然后require 'socket'会失败:

> print(package.cpath)
.\?.dll;.\?51.dll;C:\Program Files\Lua\5.1\?.dll;C:\Program Files\Lua\5.1\?51.dl
l;C:\Program Files\Lua\5.1\clibs\?.dll;C:\Program Files\Lua\5.1\clibs\?51.dll;C:
\Program Files\Lua\5.1\loadall.dll;C:\Program Files\Lua\5.1\clibs\loadall.dll
> print(package.path)
;.\?.lua;C:\Program Files\Lua\5.1\lua\?.lua;C:\Program Files\Lua\5.1\lua\?\init.
lua;C:\Program Files\Lua\5.1\?.lua;C:\Program Files\Lua\5.1\?\init.lua;C:\Progra
m Files\Lua\5.1\lua\?.luac
> require 'socket'
.\socket.lua:13: module 'socket.core' not found:
        -- look for preload
        no field package.preload['socket.core']
        -- look for .lua in socket folder anywhere on package.path:
        no file '.\socket\core.lua'
        no file 'C:\Program Files\Lua\5.1\lua\socket\core.lua'
        no file 'C:\Program Files\Lua\5.1\lua\socket\core\init.lua'
        ...
        -- look for .luac in socket folder anywhere on package.path:
        no file 'C:\Program Files\Lua\5.1\lua\socket\core.luac'
        -- look for .dll in socket folder anywhere on package.cpath:
        no file '.\socket\core.dll'
        no file '.\socket\core51.dll'
        no file 'C:\Program Files\Lua\5.1\socket\core.dll'
        no file 'C:\Program Files\Lua\5.1\socket\core51.dll'
        no file 'C:\Program Files\Lua\5.1\clibs\socket\core.dll'
        no file 'C:\Program Files\Lua\5.1\clibs\socket\core51.dll'
        ...
stack traceback:
        [C]: in function 'require'
        .\socket.lua:13: in main chunk
        [C]: in function 'require'
        stdin:1: in main chunk
        [C]: ?

因为socket.lua需要socket.core,所以 Lua 解释器core.lua在任何地方的“socket”文件夹package.path中寻找,没有找到它(socket 文件夹不存在),然后core.dllsocket文件夹中的任何地方寻找package.cpath,同样的问题。

现在创建C:\Foo\socket文件夹,然后移动core.dll到它,然后require 'socket'就可以工作了(从解释器开始,而 cd 到C:\Foo)。

在你的情况下,如果你有yourLuaScript.luain C:\Foo,你可以socket.lua在同一个文件夹中,core.dllinC:\Foo\socketyourLuaScript.luacanrequire 'socket'并且只要package.pathcontains.\*.luapackage.cpathcontains .\*.dll,你就可以运行yourLuaScript.lua

于 2014-01-23T03:36:41.383 回答