SBCL:构建一个独立的可执行文件

Too*_*rot 3 compilation common-lisp

如何在SBCL中构建独立的可执行文件?我试过了

; SLIME 2.20
CL-USER> (defun hullo ()
                     (format t "hullo"))
HULLO
CL-USER> (sb-ext:save-lisp-and-die "hullo" :toplevel #'hullo :executable t)
Run Code Online (Sandbox Code Playgroud)

但这只会产生以下错误.

Cannot save core with multiple threads running.

Interactive thread (of current session):
  #<THREAD "main thread" RUNNING {10019563F3}>

Other threads:
  #<THREAD "Swank Sentinel" RUNNING {100329E073}>,
  #<THREAD "control-thread" RUNNING {1003423A13}>,
  #<THREAD "reader-thread" RUNNING {1003428043}>,
  #<THREAD "swank-indentation-cache-thread" RUNNING
     {1003428153}>,
  #<THREAD "auto-flush-thread" RUNNING {1004047DA3}>,
  #<THREAD "repl-thread" RUNNING {1004047FA3}>
   [Condition of type SB-IMPL::SAVE-WITH-MULTIPLE-THREADS-ERROR]
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Dan*_*son 5

你做错了是在多个线程运行时尝试保存图像.与Lisp中的许多错误不同,错误消息准确地解释了问题所在.

如果您在SBCL手册中查找功能在这里,你会发现一个确实可能无法保存图像多线程运行.额外的线程来自swank(SLIME的CL一半).手册说你可以添加*save-hooks*破坏多余线程和函数的函数*init-hooks*来恢复线程.

解决这一问题的一种方法是在图像运行时不保存图像,而是直接在终端启动sbcl(注意:没有readline支持),加载程序并从那里保存.

使用粘液是不同的.理论上有一个SWANK-BACKEND:SAVE-IMAGE功能,但我不确定这是否有效.此外,保存图像会杀死您可能首先想要fork(SB-POSIX:FORK)的进程,除非您在Windows上.但由于没有明确指定和文件描述符问题,分叉会导致问题(例如,如果您尝试,fork->close swank connection->save and die则可能会发现父进程中的连接已关闭(或者更糟糕的是,通过打开但在某个较低级别关闭而损坏)).人们可以在网上阅读这些内容.请注意,由于sbcl线程的实现方式,只分叉克隆的线程和其他线程未克隆.因此,分叉然后保存应该可以工作,但是由于部分粘液状态而在运行可执行文件时可能会导致问题.

您可能对buildapp感兴趣.

如果你想在你保存的应用程序中使用slime,你可以加载swank并开始侦听套接字或端口(可能带有一些命令行参数),然后在Emacs中你可以使用slime连接到那个swank后端.

  • [sbcli](https://github.com/hellerve/sbcli)给出了一个带有readline支持的repl(由[cl-readline](https://github.com/mrkkrp/cl-readline)提供).需要时方便. (2认同)