0

我有 lua,我使用 luarocks 安装了它。

编辑:在 Windows 系统上

我通过从这里下载 v202-3 的 luasocket-2.0.2-3.win32-x86.rock 文件成功安装了 luasocket 。它是一个旧版本,但它可以工作。

但是现在我需要安装 yaml 以便可以使用 yaml 文件。现在我被迫使用 *.src.rock 文件或 .rockspec 文件进行安装。

我试过了:

luarocks install yaml这使:

D:\user\workspace\_lua>luarocks install yaml
Warning: Failed searching manifest: Failed fetching manifest for https://luarocks.org - Failed downloading https://luarocks.org/manifest - C:\Users\user\AppData\Local/LuaRocks/Cache/https___luarocks.org/manifest
Warning: Failed searching manifest: Failed fetching manifest for https://raw.githubusercontent.com/rocks-moonscript-org/moonrocks-mirror/master/ - Failed downloading https://raw.githubusercontent.com/rocks-moonscript-org/moonrocks-mirror/master/manifest - C:\Users\user\AppData\Local/LuaRocks/Cache/https___raw.githubusercontent.com_rocks-moonscript-org_moonrocks-mirror_master_/manifest
Warning: Failed searching manifest: Failed fetching manifest for http://luafr.org/moonrocks/ - Failed downloading http://luafr.org/moonrocks/manifest - C:\Users\user\AppData\Local/LuaRocks/Cache/http___luafr.org_moonrocks_/manifest
Warning: Failed searching manifest: Failed fetching manifest for http://luarocks.logiceditor.com/rocks - Failed downloading http://luarocks.logiceditor.com/rocks/manifest - C:\Users\user\AppData\Local/LuaRocks/Cache/http___luarocks.logiceditor.com_rocks/manifest

Error: No results matching query were found.

所以,然后我下载yaml-1.1.2-1.src.rock并运行了命令: luarocks install yaml-1.1.2-1.src.rock

这告诉我我有依赖项 yaml --> lub --> luafilesystem。所以我下载了:

  • luafilesystem-1.6.3-2.src.rock
  • lub-1.1.0-1.src.rock
  • yaml-1.1.2-1.src.rock

我一个接一个地安装了它们,结果是:

  • luarocks install luafilesystem-1.6.3-2.src.rock- 好的
  • luarocks install lub-1.1.0-1.src.rock- 好的
  • luarocks install yaml-1.1.2-1.src.rock- 失败,请参阅下面的错误

错误日志:

D:\user\downloads\luarocks-2.3.0-win32\extras>luarocks install yaml-1.1.2-1.src.rock
Using yaml-1.1.2-1.src.rock... switching to 'build' mode
mingw32-gcc -O2 -c -o src/api.o -ID:/user/install/lua/luarocks/include src/api.c -Isrc
mingw32-gcc -O2 -c -o src/b64.o -ID:/user/install/lua/luarocks/include src/b64.c -Isrc
mingw32-gcc -O2 -c -o src/dumper.o -ID:/user/install/lua/luarocks/include src/dumper.c -Isrc
mingw32-gcc -O2 -c -o src/emitter.o -ID:/user/install/lua/luarocks/include src/emitter.c -Isrc
mingw32-gcc -O2 -c -o src/loader.o -ID:/user/install/lua/luarocks/include src/loader.c -Isrc
mingw32-gcc -O2 -c -o src/lyaml.o -ID:/user/install/lua/luarocks/include src/lyaml.c -Isrc
mingw32-gcc -O2 -c -o src/parser.o -ID:/user/install/lua/luarocks/include src/parser.c -Isrc
mingw32-gcc -O2 -c -o src/reader.o -ID:/user/install/lua/luarocks/include src/reader.c -Isrc
mingw32-gcc -O2 -c -o src/scanner.o -ID:/user/install/lua/luarocks/include src/scanner.c -Isrc
mingw32-gcc -O2 -c -o src/strtod.o -ID:/user/install/lua/luarocks/include src/strtod.c -Isrc
In file included from src/strtod.c:23:0:
src/strtod.c:24:17: warning: '_errno' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes]
 extern  int     errno;
                 ^
mingw32-gcc -O2 -c -o src/writer.o -ID:/user/install/lua/luarocks/include src/writer.c -Isrc
mingw32-gcc -shared -o yaml/core.dll src/api.o src/b64.o src/dumper.o src/emitter.o src/loader.o src/lyaml.o src/parser.o src/reader.o src/scanner.o src/strtod.o src/writer.o D:/user/install/lua/luarocks/lua5.1.lib -lMSVCR80
src/api.o:api.c:(.text+0x395): undefined reference to '_imp__yaml_realloc'
src/api.o:api.c:(.text+0x412): undefined reference to '_imp__yaml_string_extend'
            :
    LOTS OF THESE
            :
src/scanner.o:scanner.c:(.text.unlikely+0x29d0): undefined reference to '_imp__yaml_queue_extend'
src/scanner.o:scanner.c:(.text.unlikely+0x29e8): undefined reference to '_imp__yaml_token_delete'
collect2.exe: error: ld returned 1 exit status

Error: Build error: Failed compiling module yaml/core.dll

有谁知道为什么这个构建失败?- 我直接从这里得到它:https://luarocks.org/modules/gaspard/yaml/1.1.2-1哪个是下载次数最多的版本......所以我想它应该可以工作?

我的意思是,我可以看到错误是什么......但我不明白为什么会有错误。我该如何解决这个问题?...任何帮助表示赞赏:)

更新

感谢 siffiejoe 的评论,我能够编译 yaml rock。这是输出:

D:\user\downloads\luarocks-2.3.0-win32\extras>luarocks install yaml-1.1.2-1.src.rock CC="gcc -DYAML_DECLARE_STATIC"
Using yaml-1.1.2-1.src.rock... switching to 'build' mode
gcc -DYAML_DECLARE_STATIC -O2 -c -o src/api.o -ID:/user/install/lua/luarocks/include src/api.c -Isrc
gcc -DYAML_DECLARE_STATIC -O2 -c -o src/b64.o -ID:/user/install/lua/luarocks/include src/b64.c -Isrc
gcc -DYAML_DECLARE_STATIC -O2 -c -o src/dumper.o -ID:/user/install/lua/luarocks/include src/dumper.c -Isrc
gcc -DYAML_DECLARE_STATIC -O2 -c -o src/emitter.o -ID:/user/install/lua/luarocks/include src/emitter.c -Isrc
gcc -DYAML_DECLARE_STATIC -O2 -c -o src/loader.o -ID:/user/install/lua/luarocks/include src/loader.c -Isrc
gcc -DYAML_DECLARE_STATIC -O2 -c -o src/lyaml.o -ID:/user/install/lua/luarocks/include src/lyaml.c -Isrc
gcc -DYAML_DECLARE_STATIC -O2 -c -o src/parser.o -ID:/user/install/lua/luarocks/include src/parser.c -Isrc
gcc -DYAML_DECLARE_STATIC -O2 -c -o src/reader.o -ID:/user/install/lua/luarocks/include src/reader.c -Isrc
gcc -DYAML_DECLARE_STATIC -O2 -c -o src/scanner.o -ID:/user/install/lua/luarocks/include src/scanner.c -Isrc
gcc -DYAML_DECLARE_STATIC -O2 -c -o src/strtod.o -ID:/user/install/lua/luarocks/include src/strtod.c -Isrc
In file included from src/strtod.c:23:0:
src/strtod.c:24:17: warning: '_errno' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes]
 extern  int     errno;
                 ^
gcc -DYAML_DECLARE_STATIC -O2 -c -o src/writer.o -ID:/user/install/lua/luarocks/include src/writer.c -Isrc
mingw32-gcc -shared -o yaml/core.dll src/api.o src/b64.o src/dumper.o src/emitter.o src/loader.o src/lyaml.o src/parser.o src/reader.o src/scanner.o src/strtod.o src/writer.o D:/user/install/lua/luarocks/lua5.1.lib -lMSVCR80
Updating manifest for D:\user\install\lua\luarocks\systree/lib/luarocks/rocks
yaml 1.1.2-1 is now built and installed in D:\user\install\lua\luarocks\systree (license: MIT)

所以它说它已安装。但是,当我尝试使用 yaml 包时,它找不到它:

local yaml = require("yaml")
local data = yaml.load("mytest.yaml")

系统报告找不到yaml.lua或yaml.dll。然后我在我发现的 luarocks 文件夹中搜索了 *.lua 和 *.dll:

D:\user\install\lua\luarocks\systree>dir *.lua *.dll /b /s
D:\user\install\lua\luarocks\systree\lib\lua\5.1\lfs.dll
D:\user\install\lua\luarocks\systree\lib\lua\5.1\mime\core.dll
D:\user\install\lua\luarocks\systree\lib\lua\5.1\socket\core.dll
D:\user\install\lua\luarocks\systree\lib\lua\5.1\yaml\core.dll
D:\user\install\lua\luarocks\systree\lib\luarocks\rocks\luafilesystem\1.6.3-2\tests\test.lua
D:\user\install\lua\luarocks\systree\share\lua\5.1\ltn12.lua
D:\user\install\lua\luarocks\systree\share\lua\5.1\mime.lua
D:\user\install\lua\luarocks\systree\share\lua\5.1\socket.lua
D:\user\install\lua\luarocks\systree\share\lua\5.1\lub\Autoload.lua
D:\user\install\lua\luarocks\systree\share\lua\5.1\lub\Dir.lua
D:\user\install\lua\luarocks\systree\share\lua\5.1\lub\init.lua
D:\user\install\lua\luarocks\systree\share\lua\5.1\lub\Param.lua
D:\user\install\lua\luarocks\systree\share\lua\5.1\lub\Template.lua
D:\user\install\lua\luarocks\systree\share\lua\5.1\socket\ftp.lua
D:\user\install\lua\luarocks\systree\share\lua\5.1\socket\http.lua
D:\user\install\lua\luarocks\systree\share\lua\5.1\socket\smtp.lua
D:\user\install\lua\luarocks\systree\share\lua\5.1\socket\tp.lua
D:\user\install\lua\luarocks\systree\share\lua\5.1\socket\url.lua
D:\user\install\lua\luarocks\systree\share\lua\5.1\yaml\init.lua

例如,我设法安装了 luasocket,luarocks install luasocket-2.0.2-3.win32-x86.rock因为有一个 .rock 文件可用。所以你可以看到有一个socket.lua。对于 yaml、lub 和 luafilesystem,我可以看到各种安装位置,但没有 .lua 或 .dll 文件……我专门搜索了更多 yaml:

D:\user\install\lua\luarocks\systree>dir *yaml* /b /s
D:\user\install\lua\luarocks\systree\lib\lua\5.1\yaml
D:\user\install\lua\luarocks\systree\lib\luarocks\rocks\yaml
D:\user\install\lua\luarocks\systree\lib\luarocks\rocks\yaml\1.1.2-1\yaml-1.1.2-1.rockspec
D:\user\install\lua\luarocks\systree\share\lua\5.1\yaml

嗯...然后我去从 git 克隆项目(必须下载 zip 文件,因为我愚蠢的 IT 阻止了我的 git clone ...(端口 443)。

所以终于得到了排序,然后在 yaml-master 文件夹中我尝试了:

luarocks make yaml-1.1.2-1.rockspec CC-"gcc -DYAML_DECLARE_STATIC"

这与以前的效果相同。所以现在我已经尝试了 .src.rock 和 .rockspec 类型......

我又卡住了:(

更新 2

当我从 git 构建时,顶层有一个名为 yaml.lua 的文件。但它包含的只是文本yaml/init.lua......不知道如何处理 - 尝试将其复制到我的..install\lua\luarocks\systree\share\lua\5.1目录中,但是当我运行我的测试 lua projam 时它给出了一个错误......这是怎么回事,它可以'没有这么难安装:(

更新 3

继 siffiejoe 的出色回答之后,我或多或少地安装了这个 yaml。但我有一个运行它的错误:

这是我的lua脚本:

package.path = "D:\\user\\install\\lua\\luarocks\\systree\\share\\lua\\5.1\\?\\init.lua;" .. package.path
print("package.path: " .. package.path)
local yaml = require("yaml")
local data = yaml.load("mytest.yaml")

我现在在测试时手动添加 lua 路径。当我运行它时,我得到了窗口:

在此处输入图像描述

我的日志看起来像:

D:\user\install\lua\luarocks\systree\share\lua\5.1\?\init.lua;D:\user\install\lua\luarocks\systree\share\lua\5.1\?.lua;D:\user\install\lua\luarocks\systree\share\lua\5.1\?\init.lua;./?.lua;./?/init.lua;./lua/?.lua;./lua/?/init.lua;D:\user\install\lua\zerobrane\lualibs/?/?.lua;D:\user\install\lua\zerobrane\lualibs/?.lua;D:\user\install\lua\zerobrane\lualibs/?/?/init.lua;D:\user\install\lua\zerobrane\lualibs/?/init.lua
D:\user\install\lua\zerobrane\bin\lua.exe: error loading module 'lfs' from file 'D:\user\install\lua\luarocks\systree\lib\lua\5.1\lfs.dll':
    The specified procedure could not be found.


stack traceback:
    [C]: at 0x66df0460
    [C]: in function 'require'
    ...\install\lua\luarocks\systree\share\lua\5.1\lub\init.lua:17: in main chunk
    [C]: in function 'require'
    ...install\lua\luarocks\systree\share\lua\5.1\yaml\init.lua:25: in main chunk
    [C]: in function 'require'
    D:\user\workspace\_lua\myluatest.lua:3: in main chunk
    [C]: at 0x00402a57
Program completed in 56.64 seconds (pid: 15856).

所以它似乎回到了这个 MSVCR80.dll ......这对我来说没有意义,我认为这与微软有关......我读过的一些关于它的内容可能是一个损坏的 MSVCR80.dll 需要更换或东西。但我还不确定为什么会发生这种情况。有什么想法吗?

4

1 回答 1

3

src/yaml.h来自github 存储库的包含文件包含以下预处理器代码:

#ifdef WIN32
#   if defined(YAML_DECLARE_STATIC)
#       define  YAML_DECLARE(type)  type
#   elif defined(YAML_DECLARE_EXPORT)
#       define  YAML_DECLARE(type)  __declspec(dllexport) type
#   else
#       define  YAML_DECLARE(type)  __declspec(dllimport) type
#   endif
#else
#   define  YAML_DECLARE(type)  type
#endif

这意味着在 Windows 上,默认情况下所有与 yaml 相关的函数都被装饰__declspec(dllimport)_imp__链接器错误消息中的前缀是提示)。因此,链接器希望这些函数位于外部 DLL 中。但是 yaml 代码与 Lua 绑定一起捆绑并编译为单个 DLL yaml\core.dll,因此链接器会抱怨。解决这个问题的正确方法是从 yaml 函数中删除所有与导入/导出相关的装饰,这可以通过定义YAML_DECLARE_STATIC. 这个宏肯定应该在 rockspec 中设置(我稍后会发布错误报告),但是一个快速而肮脏的解决方案是通过CC命令行上的变量来设置它:

luarocks install yaml-1.1.2-1.src.rock CC="mingw32-gcc -DYAML_DECLARE_STATIC"

之后,你的 LuaRocks 目录中应该有一个yaml\core.dll文件和一个文件。yaml\init.lua要使用 Lua yaml 绑定,您必须确保 arequire("yaml")加载yaml\init.lua文件,并且require("yaml.core")加载yaml\core.dll. 这可以通过添加到package.path/ package.cpath(从您的 Lua 脚本中)或最好添加到LUA_PATH/来实现LUA_CPATH。由于已安装的 LuaSocket 已经工作,您可能已经LUA_PATH/LUA_CPATH大部分设置正确,但是 yaml 绑定使用与 LuaSocket 不同的方法来加载其主要 Lua 模块:LuaSocket 具有socket.luafor require("socket"),但 yaml 具有yaml\init.luafor require("yaml")。这种方法的优点是任何 Lua 子模块(例如yaml.a) 将与主 Lua 模块的代码位于同一目录中。无论如何,您还必须添加

D:\user\install\lua\luarocks\systree\share\lua\5.1\?\init.lua

到您的LUA_PATH环境变量。

顺便说一句,yaml.lua您在 github 存储库中找到的文件是一个符号链接,无论如何都无法在 Windows 上正常工作(但它可能会干扰,因此您不应该将其放入 Rocks 树中)。它只是为了在开发过程中提供方便。

于 2016-08-18T10:20:29.057 回答