【问题标题】:MSVCR80.dll runtime errors when using lua with luafilesystem使用 lua 和 luafilesystem 时的 MSVCR80.dll 运行时错误
【发布时间】:2016-12-28 21:23:54
【问题描述】:

接续上一个问题(已回答)here。我设法解决了特定问题,但随后又遇到了另一个问题 - 该问题的第三次更新中有详细信息,但我将它们移到这里,因为它现在是一个新问题:

我已经安装了 luarocks(它带有 lua 和一个版本的 msvcr80.dll)。然后我终于设法安装了yaml。由于本地 IT 阻塞,我无法直接从“luarocks install yaml”命令行安装它,但我能够下载 src.rock 文件并按如下方式安装它(及其依赖项):

luarocks install luafilesystem-1.6.3-2.src.rock    (required buy lub)
luarocks install lub-1.1.0-1.src.rock              (required by yaml)
luarocks install yaml-1.1.2-1.src.rock CC="gcc -DYAML_DECLARE_STATIC"

然后我将包路径添加到我的脚本中(现在),以便我可以使用 yaml,这是我非常基本的测试脚本:

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")

正如您所看到的,我在包含 yaml 并尝试读取 yaml 文件方面所做的一切 - 非常基本。当我运行它时,我收到以下错误:

我的日志看起来像:

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).

它肯定是在 luarocks 安装文件夹中使用 MSVCR80.DLL,因为当我更改该文件的名称时,它会抱怨缺少 DLL。

所以问题似乎是 luafilesystem 必须需要一个不同版本的 MSVCR80.DLL 然后安装 luarocks。我不知道如何解决。如果我能够运行命令“luarocks install yaml”,那会有什么不同吗? - msvcr80.dll 文件有更新吗?但是如果我更改此文件版本,那么 luarocks 的其他部分不会停止工作吗? - 我真的不明白。

我想到的只有一个想法,那就是安装“lfs”并将其链接到 MSVCR80.DLL 的 luarocks 版本,但同样 - 我不知道该怎么做。

更新

好的,我发现这篇文章看起来很有希望:link-to-article。但是在某个地方,我不再遇到同样的错误。现在我得到的错误是:

日志说:

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':
    A dynamic link library (DLL) initialization routine failed.


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:10: in main chunk
    [C]: at 0x00402a57
Program completed in 56.52 seconds (pid: 15220).

我已尝试删除 lua/love/luarocks + 所有软件包并重新开始。一旦我尝试安装 luafilesystem(我是否链接到 MSVCR80.dll 的天气),我就会收到同样的错误。

我目前在微软运行时地狱中:o .. 请帮忙!

更新2

所以我删除了所有与 lua 相关的内容(路径和所有)。然后我重新安装:

  • luarocks
  • luasockets
  • lfs
  • 卢布
  • yaml
  • zerobrain

我必须将 luarocks 添加到我的路径中,以便我可以运行 lua.exe。

然后我运行了我的测试脚本。它失败并出现错误...procedure entry point utime could not be located...

所以恢复正常。然后我从 git 得到了 lfs 源代码。我运行了 make(它使用 -lMSVCR80 链接。我重新运行了没有 MSVCR80 的链接命令以生成新的 lfs.dll 并将其复制到 D:\user\install\lua\luarocks\systree\lib\lua\5.1 中的那个。

现在我再次运行我的脚本,得到它抱怨找不到lub\autoload.lua 的结果。我运行以下脚本只是为了查看 lfs 是否正常:

package.path = "D:\\adadachanji\\install\\lua\\luarocks\\systree\\share\\lua\\5.1\\?\\init.lua;" .. package.path
package.path = "D:\\adadachanji\\install\\lua\\luarocks\\systree\\share\\lua\\5.1\\?.lua;" .. package.path
print("package.path: " .. package.path)

local lfs = require( "lfs" )
local doc_path = "d:\\user"
print("doc_path = " .. doc_path)
for file in lfs.dir( doc_path ) do

    print( "Found file: " .. file )
end

这工作正常:)

现在我添加 lub:local lub = require("lub"),再次运行:它可以工作 :)

现在我添加 yaml:local yaml = require("yaml"),然后我得到了我的错误。

我在 zerobrain IDE 中运行它。然后我决定在命令行上试试这个(因为我认为 zerobrain 有自己的 lua 版本)。

...它的工作原理!

所以我在这里发现了一大堆问题...... zerobrains(字面意思)似乎是一堆 %$ - 完全忽略了您在其他地方安装的任何内容。 yaml 中存在需要额外命令行参数的错误。 lfs 中存在 64 位问题。这些东西都没有以任何明智的方式真正整合......

我将发布一个答案,详细说明将以下内容放在一起所需的步骤:

  • lua(通过 luarocks)
  • lua 套接字
  • yaml(使用 lfs 和 lub)

不是很长的列表 - 应该很简单,但不是。

【问题讨论】:

    标签: windows lua runtime-error yaml msvcrt


    【解决方案1】:

    这是我承诺的安装说明...我没有详细说明我从哪里获得所有文件,但快速谷歌搜索应该可以让你到达那里。如果不问,我会找到他们!

    1。使用 LUA 5.1 和 LOVE 安装 LuaRocks

    1. 下载 LuaRocks 然后输入以下命令(根据需要修改路径): install /L /p D:\install-path\luarocks /MW /F

      注意: /L 告诉它为你安装 Lua 5.1(所以你也不必安装它),它使用 mingw 编译器,它需要在你的路径中。

      注意:你可以在线安装mingw“mingw-get-setup.exe”——它的默认路径是:C:\MinGW,但是你可以随便放!

    2. 下载“love-0.10.1-win64”(或任何版本)并将其解压缩到您想要的任何位置(无需安装)

    3. 添加/修改以下环境变量(根据需要修改路径):

      • 路径:D:\install-path\luarocks;D:\install-path\love;
      • PATHEXT : .LUA
      • LUA_PATH : D:\install-path\luarocks\systree\share\lua\5.1\?.lua;D:\install-path\luarocks\systree\share\lua\5.1\?\init.lua;
      • LUA_CPATH:D:\install-path\luarocks\systree\lib\lua\5.1\?.dll

    2。安装 LUA Socket

    1. 下载luasocket-2.0.2-3.win32-x86.rock并以管理员身份打开cmd提示符
    2. cd 进入下载文件夹
    3. 运行命令:luarocks install luasocket-2.0.2-3.win32-x86.rock
    4. 添加以下环境变量(根据需要修改路径):
      • LUA_PATH=D:\install-path\luarocks\systree\share\lua\5.1\?.lua
      • LUA_CPATH=D:\install-path\luarocks\systree\lib\lua\5.1\?.dll

    3。 LUA 文件系统 (LFS)

    对于 64 位系统存在问题,其中函数名称从 function() 更改为 function32()(微软做得很好),这样使用较新 MSVCR dll 的旧库会出现找不到函数的问题起点。这些说明展示了如何安装 lfs(有这个问题)并解决它。如果您使用的是 32 位,则可能不必这样做 -

    1. 从 git repo 中获取 luafilesystem,解压并 cd 到该文件夹​​ (luafilesystem-master)。
    2. 运行 luarocks make 这将安装 lfs(请注意,链接器行最后使用 -lMSVCR80 - 这会打印在标准输出中)。
    3. 复制并粘贴链接器行并删除“-lMSVCR80”并按回车键。这将创建一个新的本地 lfs.dll
    4. 将其复制到现有 lfs.dll 的顶部:D:\install-path\luarocks\systree\lib\lua\5.1

    4。 YAML\LUB

    1. 在您的 mingw bin 文件夹中确保 mingw32-gcc.exe 存在,如果不存在则将 gcc.exe 复制到 mingw32-gcc.exe。
    2. 以管理员身份打开命令提示符并 cd 到您的下载文件夹
    3. 对于以下各项,请从https://luarocks.org 下载 src.rock 文件并运行以下命令(yaml 依赖于 lub,lub 依赖于 luafilesystem):
      • (已弃用 - 请参阅第 3 节):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 CC="mingw32-gcc -DYAML_DECLARE_STATIC"

    5。其他陷阱

    1. 不要为无脑(zerobrane)而烦恼 - 除非您想使用它附带的 lua 版本,这会导致与您漂亮的 luarocks 设置发生冲突。此外,它无法处理任何深度的代码完成(即任何附加模块)。如果你想爱用它,你需要将活动文件夹设置为你的 main.lua 文件所在的子文件夹......然后它的文件树视图放大到这个文件夹,这样你就不能轻易切换回其他文件夹。
    2. 不要使用consoleZ(也可能是已知的console 2)。环境变量似乎有问题。如果我添加 var LUA_PATH 我会收到奇怪的错误,实际上如果我添加任何以“LUA ...”开头的 var 我会收到错误 - 我已经有其他以“LUA”开头的 var 所以它之前可能只能处理这么多它放弃了!无论如何,使用沼泽标准命令提示符是有效的,所以我放弃了 consoleZ 并开始使用 ConEmu - 好多了!

    我认为就是这样......老实说 - 感觉这些东西是由旧的蓝色大头钉和一点点运气组成的:o - 这是我的第一次 lua/love 体验,它非常糟糕到目前为止一个;但现在我实际上可以做一些工作让我们看看它是否和它的声誉一样好...... :) 请随时添加/评论额外的陷阱/注释,我会更新(或自己更新)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 2015-03-26
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 2014-11-27
      相关资源
      最近更新 更多