SBCL(WSL1 Ubuntu18.04)安装usocket报sbcl.fasl未找到如何解决
故障环境
- 系统:WSL1 运行 Ubuntu 18.04.5
- Lisp实现:SBCL 1.4.5
- 包管理工具:Quicklisp
故障表现
执行(ql:quickload :dexador)加载dexador库时触发编译错误,核心报错为usocket库的SBCL后端文件编译失败:
COMPILE-FILE-ERROR while compiling #<CL-SOURCE-FILE "usocket" "backend" "sbcl"> [Condition of type UIOP/LISP-BUILD:COMPILE-FILE-ERROR]
开启错误断点(setf *break-on-signals* 'error)后单独加载usocket库(ql:quickload :usocket),得到具体错误提示:
Failed to find _Personal_/.cache/common-lisp/sbcl-1.4.5.debian-linux-x64/_Personal_/quicklisp/dists/quicklisp/software/usocket-0.8.4/backend/sbcl.fasl: No such file or directory BREAK was entered because of *BREAK-ON-SIGNALS* (now rebound to NIL)
后续测试确认,所有依赖usocket的库(比如Drakma)加载时都会触发完全相同的报错。
故障根因
WSL1默认会透传Windows系统的HOME环境变量,若Windows侧的用户家目录路径包含空格、特殊字符,ASDF在生成编译缓存路径时会自动将异常路径段替换为_Personal_,导致编译生成的fasl文件存放路径和加载时的查找路径不匹配,最终出现找不到sbcl.fasl的错误。
修复步骤
- 第一步:清理旧的损坏缓存和残留文件,在WSL终端执行以下命令:
rm -rf ~/quicklisp/dists/quicklisp/software/usocket-* rm -rf ~/.cache/common-lisp/
- 第二步:修复WSL环境变量透传问题,打开当前shell的配置文件(bash对应
~/.bashrc,zsh对应~/.zshrc),在文件末尾添加以下配置:
unset HOME export HOME=/home/你的WSL登录用户名
保存退出后执行source ~/.bashrc(zsh对应执行source ~/.zshrc)让配置生效,执行echo $HOME确认输出为WSL内部的Linux家目录路径,而非/mnt/c/Users/开头的Windows挂载路径。
- 第三步:重启SBCL,在REPL中先执行
(ql:quickload :usocket),此时ASDF会将usocket的编译文件输出到正确的缓存路径,不会再出现_Personal_路径替换问题。 - 第四步:usocket加载无报错后,再执行
(ql:quickload :dexador)即可正常加载目标库,其余依赖usocket的库也可正常加载使用。
内容的提问来源于stack exchange,提问作者Koom
相关产品推荐
相关产品推荐

