在c-compile过程中使用Luarock安装yaml for lua时出现的问题

在c-compile过程中使用Luarock安装yaml for lua时出现的问题,c,windows,lua,yaml,luarocks,C,Windows,Lua,Yaml,Luarocks,我有lua,我是用luarocks命名的 在windows系统上编辑: 我通过从下载luasocket-2.0.2-3.win32-x86.rock文件成功安装了luasocket。这是一个旧版本,但它的工作 但是,现在我需要安装yaml,以便可以使用yaml文件。现在我被迫使用*.src.rock文件或.rockspec文件进行安装 我试过: Luarock安装yaml,提供: D:\user\workspace\_lua>luarocks install yaml Warning: F

我有lua,我是用luarocks命名的

在windows系统上编辑:

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

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

我试过:

Luarock安装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
并运行了以下命令:
luarock安装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
我一个接一个地安装了它们,结果是:

  • luarock安装luafilesystem-1.6.3-2.src.rock
    -正常
  • luarock安装lub-1.1.0-1.src.rock
    -正常
  • Luarock安装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 packge时,它没有找到:

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
例如,我成功地用
luarocks安装luasocket-2.0.2-3.win32-x86.rock安装了luasocket,因为有一个.rock文件可用。你可以看到有一个插座。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克隆项目(因为我愚蠢的阻止了我的git克隆…(端口443),所以不得不下载zip文件

因此,最终得到了排序,然后在yaml主文件夹中,我尝试:

Luarock制造yaml-1.1.2-1.rockspec CC-“gcc-动态声明静态”

这和以前的效果一样。所以现在我尝试了.src.rock和.rockspec两种类型

我又被卡住了:(

更新2

当我从git构建时,在顶层有一个名为yaml.lua的文件。但它只包含文本
yaml/init.lua
…不确定该怎么办-尝试将其复制到my
.install\lua\luarocks\systree\share\lua\5.1
目录中,但当我运行我的测试lua projam时,它给出了一个错误…到底发生了什么,它不能被复制这很难安装:(

更新3

根据siffiejoe的精彩回答,我或多或少安装了这个yaml。但我有一个bug在运行它:

以下是我的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…这对我来说没有意义,我想这与microsoft有关…我读到的一些东西可能是一个损坏的MSVCR80.dll,需要更换或做些什么。但我还不确定为什么会发生这种情况。有什么想法吗?

来自的include文件包含以下预印本cessor代码:

#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相关的函数都用
\u declspec(dllimport)
修饰(链接器错误消息中的
\u imp\u
前缀是提示)。因此,链接器希望这些函数位于外部DLL中。但yaml代码与Lua绑定一起捆绑并编译为单个DLL
yaml\core.DLL
,因此链接器会抱怨。解决此问题的正确方法是从yaml函数中删除所有与导入/导出相关的装饰,这可能是错误的通过定义
YAML\u DECLARE\u STATIC
可以理解。这个宏肯定应该在rockspec中设置(稍后我会发布一个错误报告),但是一个快速而肮脏的解决方案是通过命令行上的
CC
变量设置它:

luarocks install yaml-1.1.2-1.src.rock CC="mingw32-gcc -DYAML_DECLARE_STATIC"
在此之后,Luarock目录中应该有一个
yaml\core.dll
文件和一个
yaml\init.lua
文件。要使用lua yaml绑定,必须确保a
require(“yaml”)
加载
yaml\init.lua
文件,并且
require(“yaml.core”)
加载
yaml\core.dll
。这可以通过添加到
package.path
/
package.cpath
(从Lua脚本中)来实现或者最好是通过添加到
LUA_路径
/
LUA_CPATH
。由于安装的LuaSocket已经工作,您可能已经基本正确地设置了
LUA_路径
/
LUA_CPATH
,但是yaml绑定使用了与LuaSocket不同的加载其主LUA模块的方法:LuaSocket具有
socket.LUA
>require(“socket”)
,但是yaml有
yaml\init.lua
用于
require(“yaml”)
。这种方法的优点是,任何lua子模块(例如
yaml.a
)都将与主lua模块的代码位于同一目录中。无论如何,您还必须添加

D:\user\install\lua\luarocks\systree\share\lua\5.1\?\init.lua
到您的
LUA\u路径
环境变量

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