繁体   English   中英

在C编译期间使用luarocks安装yaml for lua的问题

[英]Issues installing yaml for lua with luarocks during the c-compile

我有lua,我喜欢用luackcks迷恋。

编辑:在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 : https://luarocks.org/modules/gaspard/yaml/1.1.2-1 ,这是下载次数最多的版本...所以我认为它应该可以工作吗?

我的意思是,我可以看到错误是什么...但是我不明白为什么会有错误。 我该如何解决呢?

UPDATE

感谢siffiejoe的评论,我得以编译yaml岩石。 这是输出:

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 install luasocket-2.0.2-3.win32-x86.rock来安装luasocket,因为存在一个.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克隆...(端口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 ...对我而言这没有意义,我认为这与Microsoft有关...我已了解到的一些信息可能是损坏的MSVCR80.dll,需要替换或东西 但是我不确定为什么会这样。 有什么想法吗?

github存储库中的包含文件src/yaml.h包含以下预处理程序代码:

#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)装饰__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绑定,必须确保require("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绑定使用的加载主Lua模块的方式与LuaSocket的加载方法不同:LuaSocket具有用于require("socket") socket.lua ,但是yaml具有yaml\\init.lua作为require("yaml") 这种方法的优势在于,任何Lua子模块(例如yaml.a )都将与主Lua模块的代码位于同一目录中。 无论如何,您还必须添加

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

到您的LUA_PATH环境变量。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM