问题描述
这个问题是其他人帮助我解决的问题的提炼解决方案。可以在 this issue 和 this r/xmonad post 上找到讨论。
我主要将 Artix 与 Pacman 一起用作包管理器。今天,大约一个星期后,我升级了许多软件包,最终导致 XMonad 崩溃。
这是我从xmonad --recompile -v
收到的消息:
XMonad is recompiling and replacing itself another XMonad process because the current process is called "xmonad" but the compiled configuration should be called "xmonad-x86_64-linux"
XMonad will use ghc to recompile,because "/home/philippe/.xmonad/build" does not exist.
XMonad skipping recompile because it is not forced (e.g. via --recompile),and neither xmonad.hs nor any *.hs / *.lhs / *.hsc files in lib/ have been changed.
/home/philippe/.xmonad/xmonad-x86_64-linux: error while loading shared libraries: libHSxmonad-contrib-0.16-KKfUmtIonstICqbgIKQKYh-ghc8.10.4.so: cannot open shared object file: No such file or directory
我已经尝试了人们在互联网上提到的大量解决方案——到目前为止,我已经花了 3 个多小时试图调试这个——其中,值得注意的是:
-
cabal install --lib xmonad-contrib
,它解决了我过去在使用 XMonad 时遇到的一些问题。 - 删除并重新安装 Stack、GHC、Cabal 和 XMonad 本身。
- 通过 Stack 安装 XMonad。
- 这最终给了我相同的错误消息,不同之处在于我必须改为执行
~/.local/bin/xmonad --recompile -v
。
- 这最终给了我相同的错误消息,不同之处在于我必须改为执行
有没有人知道如何解决这个问题?我之前在升级 XMonad 时遇到过问题,但从来没有遇到过类似的问题——我喜欢 Haskell 作为一种语言,但它的包管理是我 10 多年以来体验过的最恶心、最复杂的软件之一编程生活。
如果我最终清理我的系统并通过 Stack 管理所有内容,我如何通过它编译 XMonad?仅使用 Stack 然后 xmonad --recompile
给我这个错误:
XMonad will use ghc to recompile,because "/home/philippe/.xmonad/build" does not exist.
xmonad: ghc: runProcess: runInteractiveProcess: exec: inappropriate type (Not a directory)
(顺便说一下,我确实有一个 ~/.xmonad/build/
文件夹...)
解决方法
我终于成功了。 XMonad 存储库中的人真的很有帮助,您可以在 this issue 中查看他们的帮助。
粗略地说,我所做的是:
- 从我的系统中删除所有与 Haskell 相关的内容。
- 小心地做这件事,使用很多
find
和 haskell、stack、ghc、cabal 等。不要忘记先使用pacman -Rns
和pacman -Q
卸载来自那里的所有内容。 - 正如其他一些用户所提到的,您绝对应该不要同时使用 Pacman/AUR 和 Stack/Cabal 来管理 Haskell 包。选择一个系统并坚持下去。堆栈可能是推荐的。
- 小心地做这件事,使用很多
- 直接使用 script on its documentation 安装 Stack。
- 通过 Stack 安装 GHC、XMonad 和 XMonad-Contrib。
- 创建一个 build script 用于使用 Stack 编译 XMonad:
#!/bin/sh exec stack ghc -- \ --make xmonad.hs \ -i \ -ilib \ -fforce-recomp \ -main-is main \ -v0 \ -o "$1"jk
- 将
exec $HOME/.xmonad/xmonad-x86_64-linux
添加到.xinitrc
以便它运行之前使用 Stack 编译的内容。