gpt4 book ai didi

compilation - SBCL : building a standalone executable

转载 作者:行者123 更新时间:2023-12-01 09:14:36 25 4
gpt4 key购买 nike

如何在 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)

但这只会产生以下错误。
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]

我究竟做错了什么?

最佳答案

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

如果您在 sbcl 手册中查找该函数 here然后您会发现确实可能无法在运行多个线程的情况下保存图像。额外的线程来自 swank(SLIME 的 CL 部分)。手册说你可以给*save-hooks*添加功能将多余的线程和函数销毁到 *init-hooks*恢复线程。

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

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

您可能感兴趣 buildapp .

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

关于compilation - SBCL : building a standalone executable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47888877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com