堆栈 ghci 无法加载 pthread,除非 运行 作为管理员

stack ghci can't load pthread unless running as Administrator

当我 运行 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) 上。我有另一台具有类似 OS 配置和堆栈版本的机器,在那台机器上,我没有问题。这似乎是一个环境问题,但我不知道它是什么。

我 运行来自 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 多年,这是我第一次必须 运行 作为管理员,这真的让我很困扰。可能是什么问题,我该如何解决?

FWIW,这是 Stack 版本:

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

这与我在另一台机器上使用的版本相同,但未出现该问题。

这里的例子是从运行ningGitBash复制过来的,但是我用[=16=也是一样的问题].

感谢 Fyodor Soikin,我得以找到问题。

总结

将您的用户帐户 Read & execute 权限授予 pthread.dll

详情

我不明白为什么我的这台新机器会出现这个问题,而另一台具有相同 OS 且基本相同设置的机器却没有任何问题。

仔细检查后发现,另一台机器 根本没有 pthread.dll 文件.

它确实有很多 pthread.h 的副本,我想这足以启用 Stack 来构建代码。

新机器的几个地方有 pthread.dll,包括 C:\Windows\System32\DriverStore 的子目录,这对我来说意味着这个文件最初是通过新机器使用的驱动程序到达的,但是旧的机器没有。它在 C:\Windows\System32 中也有一份 pthread.dll 的副本,但这个文件被异常锁定。我自己的用户帐户对该文件没有 ReadExecute 权限,但我可以在 管理员 模式下查看和更改权限。

我将文件的本地 UsersRead & execute 权限授予,之后一切似乎都像以前在我的其他机器上所做的那样工作。