【问题标题】:Lua import library from local path (luasocket)从本地路径导入 Lua 库(luasocket)
【发布时间】:2014-02-13 09:40:17
【问题描述】:

我对 Lua 还很陌生,我在导入机制方面遇到了一些问题。
从其他语言我习惯做这样的事情:

include "./lib/mylib.h"

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

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

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

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

有没有简单的方法来解决这个问题。我必须做些什么才能让它发挥作用?

【问题讨论】:

    标签: lua luasocket


    【解决方案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 解释器在package.path 的任何地方的“socket”文件夹中寻找core.lua,没有找到它(socket 文件夹不存在),然后寻找@987654332 @ 在socket 文件夹中的任何位置package.cpath,同样的问题。

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

    在您的情况下,如果您在C:\Foo 中有yourLuaScript.lua,则您可以在同一文件夹中拥有socket.lua,在C:\Foo\socket 中拥有core.dll,并且yourLuaScript.lua 可以在require 'socket' 中,并且只要@ 987654346@ 包含.\*.luapackage.cpath 包含.\*.dll,您将能够运行yourLuaScript.lua

    【讨论】:

    • 我用的是ubuntu所以没有文件core.lua
    猜你喜欢
    • 2016-01-09
    • 2012-04-02
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 2016-05-14
    • 2017-03-01
    • 2013-04-16
    • 1970-01-01
    相关资源
    最近更新 更多