stack ghci无法加载pthread,除非以管理员身份运行

8
当我在一个全新的项目上运行stack ghci时,它无法加载:
$ stack new repro simple
Downloading template "simple" to create project "repro" in repro\ ...

(由于问题更易读性,附加输出已省略。)
$ cd repro/

$ stack ghci
Using main module: 1. Package `repro' component repro:exe:repro with main-is file: C:\Users\mark\Desktop\repro\src\Main.hs
Building all executables for `repro' once. After a successful build of all of them, only specified executables will be rebuilt.
repro> configure (exe)
Configuring repro-0.1.0.0...
repro> initial-build-steps (exe)
Configuring GHCi with the following packages: repro
GHCi, version 8.6.5: http://www.haskell.org/ghc/  :? for help
<command line>: user specified .o/.so/.DLL could not be loaded (addDLL: pthread or dependencies not loaded. (Win32 error 5))
Whilst trying to load:  (dynamic) pthread
Additional directories searched:   C:\\Users\\mark\\AppData\\Local\\Programs\\stack\\x86_64-windows\\msys2-20180531\\mingw64\\lib
   C:\\Users\\mark\\AppData\\Local\\Programs\\stack\\x86_64-windows\\msys2-20180531\\mingw64\\bin
   C://Users//mark//AppData//Local//Programs//stack//x86_64-windows//ghc-8.6.5//mingw//bin/
   C://Users//mark//AppData//Local//Programs//stack//x86_64-windows//ghc-8.6.5//mingw//bin/../lib/
   C://Users//mark//AppData//Local//Programs//stack//x86_64-windows//ghc-8.6.5//mingw//bin/../lib/gcc/x86_64-w64-mingw32/7.2.0/
   C:/Users/mark/AppData/Local/Programs/stack/x86_64-windows/ghc-8.6.5/mingw/bin/../lib/gcc/x86_64-w64-mingw32/7.2.0/
   C:/Users/mark/AppData/Local/Programs/stack/x86_64-windows/ghc-8.6.5/mingw/bin/../lib/gcc/
   C:/Users/mark/AppData/Local/Programs/stack/x86_64-windows/ghc-8.6.5/mingw/bin/../lib/gcc/x86_64-w64-mingw32/7.2.0/../../../../x86_64-w64-mingw32/lib/../lib/
   C:/Users/mark/AppData/Local/Programs/stack/x86_64-windows/ghc-8.6.5/mingw/bin/../lib/gcc/x86_64-w64-mingw32/7.2.0/../../../../lib/
   C:/Users/mark/AppData/Local/Programs/stack/x86_64-windows/ghc-8.6.5/mingw/bin/../lib/gcc/x86_64-w64-mingw32/7.2.0/../../../../x86_64-w64-mingw32/lib/
   C:/Users/mark/AppData/Local/Programs/stack/x86_64-windows/ghc-8.6.5/mingw/bin/../lib/gcc/x86_64-w64-mingw32/7.2.0/../../../
   C:\Windows\system32

这是在Windows 10(x64)上。我有另一台配置和堆栈版本类似的机器,在那台机器上,我没有任何问题。这似乎是一个环境问题,但我无法弄清楚是什么原因。
我正在从Git Bash运行,并且如果我以管理员身份运行它,它就可以工作:
$ stack ghci
Using main module: 1. Package `repro' component repro:exe:repro with main-is file: C:\Users\mark\Desktop\repro\src\Main.hs
Building all executables for `repro' once. After a successful build of all of them, only specified executables will be rebuilt.
repro> initial-build-steps (exe)
Configuring GHCi with the following packages: repro
GHCi, version 8.6.5: http://www.haskell.org/ghc/  :? for help
[1 of 1] Compiling Main             ( C:\Users\mark\Desktop\repro\src\Main.hs, interpreted )
Ok, one module loaded.
Loaded GHCi configuration from C:\\Users\\mark\\AppData\\Local\\Temp\\haskell-stack-ghci\\2524149e\\ghci-script
*Main>

我已经在 Windows 上使用 Stack 工具有好几年了,但这是我第一次需要以管理员身份运行它,这真的让我很困扰。可能出了什么问题?我该如何解决?

顺便说一下,这是 Stack 的版本信息:

$ stack --version
Version 2.1.3, Git revision 0fa51b9925decd937e4a993ad90cb686f88fa282 (7739 commits) x86_64 hpack-0.31.2

这是与我在另一台机器上没有出现问题的相同版本。

这里的示例是从运行的Git Bash中复制的,但如果我使用cmd,问题将是相同的。


2
错误提示为“访问被拒绝”,那么可能是相关文件受到了访问控制列表的限制,或者因为最初以管理员身份下载而导致。您尝试过清除堆栈缓存吗? - Fyodor Soikin
@FyodorSoikin 是的,我已经尝试卸载 Stack,清除了 C:\sr%LOCALAPPDATA%\Programs\stack,以及本地的 .stack-work 目录,重新启动,再次安装 Stack;但是没有任何改变。 - Mark Seemann
@FyodorSoikin,多亏了你,我按照我的回答描述解决了问题。然而我觉得这个解决方案是归功于你的,所以如果你想添加一个答案,我很乐意接受。 - Mark Seemann
1
不,没关系。积累声望并不是我的目标,我实际上没有答案,只是给你一个挖掘的提示。 - Fyodor Soikin
2个回答

11

感谢Fyodor Soikin,我能够追踪到这个问题。

概述

将您的用户帐户赋予pthread.dll文件的读取和执行权限。

详细信息

我不明白为什么我的这台新机器会出现这个问题,而另一台安装相同操作系统并基本相同设置的机器却没有任何问题。

仔细检查后,发现那台其他机器根本没有pthread.dll文件。

虽然它确实有很多的pthread.h副本,我想这已经足以使Stack构建代码。

而新的机器则在几个地方都有pthread.dll,包括C:\Windows\System32\DriverStore的子目录,这让我想到这个文件最初是通过新的机器使用的驱动程序到达的,但旧的机器没有这个驱动程序。 它还在C:\Windows\System32中有一个pthread.dll的副本,但这个文件被极度锁定。 我自己的用户帐户没有读取执行该文件的权限,但在管理员模式下可以查看和更改权限。

我将本地的用户组授予该文件的读取和执行权限,此后一切似乎与我的其他机器以前做过的相同。


我可以确认这一点。在我的电脑上,C:\Windows 目录下有两个 pthread.dll 的副本:一个在 System32 目录下,另一个在 System32\DriverStore 的子目录下。我的标准用户没有对 C:\Windows\System32 目录下的文件的任何权限。看起来它是随着我 HP Elitebook 上的 Intel 宽带调制解调器驱动程序一起提供的。 - Lumen
可以确认,授予“读取和执行”权限可以解决此问题。 - Mikhail Brinchuk
以防万一,如果有人不知道如何操作,请按以下步骤在Windows 10上完成:右键单击dll文件 > 属性 > 选择“安全”选项卡 > 单击“高级”按钮(应该会跳转至权限选项卡)> 单击“更改权限”按钮(此时会要求您提升为管理员)> 单击“添加”按钮 > 单击“选择主体”链接 > 在文本框中输入“Users”(无引号)> 选择要授予的访问权限(至少是读取和执行)> 单击确定 > 单击确定 > 单击确定。 现在,您应该能够看到新的组及其访问权限。 - Motorhead

0
如果有其他人遇到这个问题并且无法更改phtread.dll的权限,另一个解决方法是将pthread.dll的副本放在“附加搜索目录”之一中 - 在我的情况下,我从C:\Windows\system32复制了pthread.dll => C:/tools/ghc-9.6.2/mingw/lib/clang/14.0.6。
它会弹出一个警告,要求系统管理员权限来复制文件,但是在我没有输入任何额外的用户名/密码的情况下继续进行。该副本默认具有必要的权限,现在我可以在我的公司笔记本电脑上无错误地运行“ghci”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接