Lua从本地路径导入库(luasocket)

时间:2014-01-23 02:12:29

标签: lua luasocket

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

include "./lib/mylib.h"

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

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

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

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

有没有一种简单的方法可以解决这个问题。我需要做些什么来实现这个目标?

1 个答案:

答案 0 :(得分: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,但找不到它(套接字文件夹不会'存在),然后在core.dll上的socket文件夹中查找package.cpath,同样的问题。

现在创建C:\Foo\socket文件夹,然后将core.dll移动到该文件夹​​,然后require 'socket'将起作用(从解释程序启动时,cd到C:\Foo)。

在您的情况下,如果yourLuaScript.lua中有C:\Foo,则socket.lua位于同一文件夹中,core.dll位于C:\Foo\socket,{{1}只要yourLuaScript.lua包含require 'socket'package.path包含.\*.lua,您就可以package.cpath运行.\*.dll