You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Stack构建自定义XMonad时的编译与运行崩溃问题

问题排查与解决方案

问题原因分析

  1. 编译接口哈希不匹配:系统全局安装的xmonad-contrib-0.17.0与Stack沙箱内构建的同版本包产生冲突,GHC混淆了全局和本地包的接口文件,导致编译时哈希校验失败。
  2. 共享库缺失:Stack默认构建动态链接的二进制文件,其依赖的GHC库仅存于Stack本地缓存目录,系统动态链接器(ld)未将该路径纳入搜索范围;同时XMonad自动重编译时生成的缓存二进制也无法访问这些库。

分步解决方案

一、解决编译接口冲突问题

  • 强制Stack使用沙箱隔离:在~/.config/xmonad/stack.yaml中添加或确保以下配置,避免Stack调用系统全局包:
    resolver: lts-18.28  # 选择与xmonad-contrib-0.17.0匹配的resolver,比如lts-18.x对应GHC 8.10.x,兼容0.17.0
    system-ghc: false
    packages:
      - .
    
  • 清理残留编译缓存:删除所有可能的冲突缓存文件:
    rm -rf ~/.config/xmonad/.stack-work ~/.config/xmonad/.stack
    rm -rf ~/.ghc/x86_64-linux-8.10.6/package.conf.d/xmonad-contrib-*
    

二、解决共享库缺失问题(两种可选方案)

方案1:构建静态链接二进制(推荐,彻底避免依赖问题)

修改构建脚本build.sh中的stack build命令,添加静态编译参数:

#!/bin/sh
SRC_DIR=$HOME/.config/xmonad
EXE_DIR=$HOME/.local/bin
EXE_NAME=xmonad
######################
cd $SRC_DIR
stack build --ghc-options="-static -optl-static" 2>.log
ln -f -T $(stack exec -- which $EXE_NAME) $EXE_DIR/$EXE_NAME 2>.log
rm ./src/$EXE_NAME.hi ./src/$EXE_NAME.o 2>/dev/null
  • -static让GHC静态链接Haskell库,-optl-static让链接器静态链接系统库,确保生成的二进制完全独立,无动态依赖。

方案2:配置动态链接器搜索路径

  1. 获取Stack库路径:执行以下命令获取Stack缓存的依赖库根路径:
    stack path --local-install-root
    
    后续完整库路径为上述输出加上/lib/x86_64-linux-ghc-<你的GHC版本>/(例如~/.stack/snapshots/lts-18.28/x86_64-linux/lib/x86_64-linux-ghc-8.10.7/)。
  2. 添加到动态链接器配置:
    echo "$(stack path --local-install-root)/lib/x86_64-linux-ghc-$(ghc --version | grep -oP '(\d+\.){2}\d+')/" | sudo tee /etc/ld.so.conf.d/stack-ghc.conf
    sudo ldconfig
    
  3. 确保XMonad启动时加载环境:在~/.xinitrc中添加环境变量(若使用startx启动):
    export LD_LIBRARY_PATH="$(stack path --local-install-root)/lib/x86_64-linux-ghc-$(ghc --version | grep -oP '(\d+\.){2}\d+')/:$LD_LIBRARY_PATH"
    exec xmonad
    

三、验证修复效果

  1. 赋予脚本执行权限并重新编译:
    chmod +x ~/.config/xmonad/build.sh
    ~/.config/xmonad/build.sh
    
  2. 重启XMonad,检查是否正常启动且无报错。

内容的提问来源于stack exchange,提问作者Oh Fiveight

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 08:05:34