MacOS下用Quicklisp加载Lisp-Stat失败的原因及解决求助
Lisp-Stat安装失败排查与解决(MacOS Monterey + SBCL)
环境信息
- SBCL 2.2.8
- Emacs 28.1(Doom Emacs配置)
- SLIME 2.27
- MacOS Monterey 12.6
触发操作
执行Common Lisp代码:
(ql:quickload :lisp-stat)
错误输出
; Loading "lisp-stat" ; caught 1 fatal ERROR condition Building #P"/Users/stefan/common-lisp/cephes.cl/scipy-cephes/libmd.so" gcc -g -O2 -Wall -Wno-unused-function -fno-builtin -fPIC -include cephes.h -include math.h -c -o cbrt.o cbrt.c
完整回溯信息
0: ((:METHOD NO-APPLICABLE-METHOD (T)) #<STANDARD-GENERIC-FUNCTION ASDF/SESSION:SESSION-CACHE (1)> NIL) [fast-method] 1: (SB-PCL::CALL-NO-APPLICABLE-METHOD #<STANDARD-GENERIC-FUNCTION ASDF/SESSION:SESSION-CACHE (1)> (NIL)) 2: (ASDF/SESSION:CALL-WITH-ASDF-SESSION #<FUNCTION (LAMBDA NIL :IN ASDF/OPERATE:OPERATE) {1002DF771B}> :OVERRIDE NIL :KEY NIL :OVERRIDE-CACHE NIL :OVERRIDE-FORCING NIL) 3: ((:METHOD ASDF/OPERATE:OPERATE :AROUND (T T)) ASDF/LISP-ACTION:LOAD-OP "lisp-stat" :VERBOSE NIL) [fast-method] 4: (ASDF/OPERATE:LOAD-SYSTEM "lisp-stat" :VERBOSE NIL) 5: (QUICKLISP-CLIENT::CALL-WITH-MACROEXPAND-PROGRESS #<FUNCTION (LAMBDA NIL :IN QUICKLISP-CLIENT::APPLY-LOAD-STRATEGY) {1002DF6AAB}>) 6: (QUICKLISP-CLIENT::AUTOLOAD-SYSTEM-AND-DEPENDENCIES "lisp-stat" :PROMPT NIL) 7: ((:METHOD QL-IMPL-UTIL::%CALL-WITH-QUIET-COMPILATION (T T)) #<unused argument> #<FUNCTION (FLET QUICKLISP-CLIENT::QL :IN QUICKLISP-CLIENT:QUICKLOAD) {1002CBDA4B}>) [fast-method] 8: ((:METHOD QL-IMPL-UTIL::%CALL-WITH-QUIET-COMPILATION :AROUND (QL-IMPL:SBCL T)) #<QL-IMPL:SBCL {1004C6D5C3}> #<FUNCTION (FLET QUICKLISP-CLIENT::QL :IN QUICKLISP-CLIENT:QUICKLOAD) {1002CBDA4B}>) [fast-m.. 9: ((:METHOD QUICKLISP-CLIENT:QUICKLOAD (T)) :LISP-STAT :PROMPT NIL :SILENT NIL :VERBOSE NIL) [fast-method] 10: (QL-DIST::CALL-WITH-CONSISTENT-DISTS #<FUNCTION (LAMBDA NIL :IN QUICKLISP-CLIENT:QUICKLOAD) {1002CAF0CB}>) 11: (SB-INT:SIMPLE-EVAL-IN-LEXENV (QUICKLISP-CLIENT:QUICKLOAD :LISP-STAT) #<NULL-LEXENV>) 12: (EVAL (QUICKLISP-CLIENT:QUICKLOAD :LISP-STAT)) 13: ((LAMBDA NIL :IN SLYNK-MREPL::MREPL-EVAL-1)) 14: (SLYNK::CALL-WITH-RETRY-RESTART "Retry SLY mREPL evaluation request." #<FUNCTION (LAMBDA NIL :IN SLYNK-MREPL::MREPL-EVAL-1) {1002CAE0AB}>) Locals: MSG = "Retry SLY mREPL evaluation request." THUNK = #<FUNCTION (LAMBDA () :IN SLYNK-MREPL::MREPL-EVAL-1) {1002CAE0AB}> 15: ((LAMBDA NIL :IN SLYNK-MREPL::MREPL-EVAL-1)) 16: ((LAMBDA NIL :IN SLYNK::CALL-WITH-LISTENER)) 17: (SLYNK::CALL-WITH-BINDINGS ((*PACKAGE* . #<PACKAGE "COMMON-LISP-USER">) (*DEFAULT-PATHNAME-DEFAULTS* . #P"/Users/stefan/Nextcloud/Dokumente/eBooks/03_Technik/Programmieren/Lisp/") (*) (**) (***) (/) ... 18: (SLYNK-MREPL::MREPL-EVAL-1 #<SLYNK-MREPL::MREPL mrepl-1-1> "(ql:quickload :lisp-stat)") 19: (SLYNK-MREPL::MREPL-EVAL #<SLYNK-MREPL::MREPL mrepl-1-1> "(ql:quickload :lisp-stat)") 20: (SLYNK:PROCESS-REQUESTS NIL) 21: ((LAMBDA NIL :IN SLYNK::SPAWN-CHANNEL-THREAD)) 22: ((LAMBDA NIL :IN SLYNK::SPAWN-CHANNEL-THREAD)) 23: (SLYNK-SBCL::CALL-WITH-BREAK-HOOK #<FUNCTION SLYNK:SLYNK-DEBUGGER-HOOK> #<FUNCTION (LAMBDA NIL :IN SLYNK::SPAWN-CHANNEL-THREAD) {1001A9800B}>) 24: ((FLET SLYNK-BACKEND:CALL-WITH-DEBUGGER-HOOK :IN "/Users/stefan/.emacs.d/.local/elpa/sly-20220713.1433/slynk/backend/sbcl.lisp") #<FUNCTION SLYNK:SLYNK-DEBUGGER-HOOK> #<FUNCTION (LAMBDA NIL :IN SLYNK:.. 25: ((LAMBDA NIL :IN SLYNK::CALL-WITH-LISTENER)) 26: (SLYNK::CALL-WITH-BINDINGS ((*PACKAGE* . #<PACKAGE "COMMON-LISP-USER">) (*DEFAULT-PATHNAME-DEFAULTS* . #P"/Users/stefan/Nextcloud/Dokumente/eBooks/03_Technik/Programmieren/Lisp/") (*) (**) (***) (/) ... 27: ((LAMBDA NIL :IN SLYNK::SPAWN-CHANNEL-THREAD)) 28: ((FLET SB-UNIX::BODY :IN SB-THREAD::RUN)) 29: ((FLET "WITHOUT-INTERRUPTS-BODY-11" :IN SB-THREAD::RUN)) 30: ((FLET SB-UNIX::BODY :IN SB-THREAD::RUN)) 31: ((FLET "WITHOUT-INTERRUPTS-BODY-4" :IN SB-THREAD::RUN)) 32: (SB-THREAD::RUN) 33: ("foreign function: call_into_lisp_") 34: ("foreign function: funcall1")
问题分析
编译失败核心原因是cephes.cl依赖的C代码在MacOS Monterey环境下编译不兼容:
- ASDF会话缓存方法调用失败(
NO-APPLICABLE-METHOD),说明编译流程中ASDF无法正确处理缓存状态 - gcc编译命令仅执行到cbrt.c就终止,无后续错误输出,大概率是MacOS默认clang(伪装成gcc)不支持部分编译参数,或是Makefile未适配Monterey环境
解决方案
方案1:替换编译器为clang并手动编译
- 进入cephes.cl的C代码目录:
cd ~/common-lisp/cephes.cl/scipy-cephes/ - 修改Makefile,将
CC=gcc替换为CC=clang - 手动清理并编译动态库:
make clean make libmd.so - 回到SBCL REPL重新加载:
(ql:quickload :lisp-stat)
方案2:更新cephes.cl到最新版本
- 删除QuickLisp中旧的cephes.cl目录:
rm -rf ~/common-lisp/cephes.cl/ - 拉取最新代码:
git clone https://github.com/Lisp-Stat/cephes.cl.git ~/common-lisp/cephes.cl/ - 进入子目录编译动态库:
cd ~/common-lisp/cephes.cl/scipy-cephes/ make libmd.so - 重新加载Lisp-Stat:
(ql:quickload :lisp-stat)
方案3:重置ASDF会话并开启 verbose 模式
如果以上方案无效,先重置ASDF缓存并查看完整编译日志:
(asdf:clear-system "cephes.cl") (asdf:clear-system "lisp-stat") (ql:quickload :lisp-stat :verbose t)
verbose模式会输出完整的编译错误信息,方便进一步定位具体问题。
额外注意事项
- 确保已安装Xcode Command Line Tools:执行
xcode-select --install确认 - Apple Silicon设备需确保终端以Rosetta模式运行(部分旧版C代码不支持ARM架构)
内容的提问来源于stack exchange,提问作者Stefan Boehringer
相关产品推荐
相关产品推荐

