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

基于cl-raylib的Common Lisp GUI:终端可运行,SLIME中无响应

问题:macOS下SLIME中cl-raylib无法启动窗口(卡在glfwInit)

问题原因

macOS的Cocoa GUI框架强制要求所有窗口初始化及操作必须在应用主线程执行。SLIME默认启动的SBCL进程是Emacs的后台子进程,其主线程被用于处理REPL交互逻辑,无法满足Cocoa对GUI主线程的要求,导致raylib底层依赖的GLFW库在调用glfwInit时卡住,无法完成Cocoa环境初始化。

解决方案

方案1:连接到终端启动的前台SBCL进程(最可靠)

这种方法让SBCL运行在终端前台,主线程可正常处理GUI操作:

  1. 打开终端,执行启动命令:
    sbcl --load ~/.quicklisp/setup.lisp
    
  2. 在SBCL REPL中启动Swank服务器:
    (ql:quickload :swank)
    (swank:create-server :port 4005 :dont-close t)
    
  3. 切换到Emacs,执行M-x slime-connect,输入主机localhost和端口4005完成连接
  4. 在SLIME中正常加载cl-raylib并运行代码:
    (ql:quickload :cl-raylib)
    (in-package :raylib-user)
    (main)
    

方案2:提前配置Cocoa应用激活策略

在SLIME中运行GUI代码前,先通过CFFI调用Cocoa API将当前进程设置为前台应用,让GLFW能正常初始化:

  1. 先加载CFFI并定义调用函数:
    (ql:quickload :cffi)
    (cffi:defcfun ("[NSApplication sharedApplication]" ns-shared-application) :pointer)
    (cffi:defcfun ("[NSApplication setActivationPolicy:]" ns-set-activation-policy) :void
      (app :pointer) (policy :int))
    
  2. 设置应用激活策略为前台:
    (let ((app (ns-shared-application)))
      (ns-set-activation-policy app 0)) ; 0对应NSApplicationActivationPolicyRegular
    
  3. 之后再调用(main)即可正常启动窗口

方案3:修改SLIME启动配置(自动前台运行)

在Emacs配置文件(如~/.emacs.d/init.el)中修改SLIME的SBCL启动参数,强制进程前台运行:

(setq slime-lisp-implementations
      '((sbcl ("sbcl"
               "--eval" "(setf *standard-output* *terminal-io*)"
               "--eval" "(setf *error-output* *terminal-io*)"
               "--eval" "(ql:quickload :swank) (swank:start-server)"))))

重启Emacs后启动SLIME,此时SBCL进程会关联到终端窗口,主线程可处理GUI操作。

验证说明

执行上述方案后,调用(main)应该能正常弹出raylib窗口,同时控制台会打印HERE!、before-set-target-fps等调试信息,窗口可正常交互和关闭。

内容的提问来源于stack exchange,提问作者Duncan Britt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:02:46