【问题标题】:How to properly save Common Lisp image using SBCL?如何使用 SBCL 正确保存 Common Lisp 图像?
【发布时间】:2017-01-01 04:27:35
【问题描述】:

如果我想为我的程序创建一个 Lisp 图像,我该如何正确地做呢?有什么先决条件吗?与 QUICKLISP 搭配起来不是很好吗?

现在,如果我启动 SBCL(仅预加载 QUICKLISP)并保存图像:

(save-lisp-and-die "core")

然后尝试使用此图像再次启动 SBCL

sbcl --core core

然后尝试做:

(ql:quickload :cl-yaclyaml)

我得到以下信息:

To load "cl-yaclyaml":
  Load 1 ASDF system:
    cl-yaclyaml
; Loading "cl-yaclyaml"
.......
debugger invoked on a SB-INT:EXTENSION-FAILURE in thread
#<THREAD "main thread" RUNNING {100322C613}>:
  Don't know how to REQUIRE sb-sprof.
See also:
  The SBCL Manual, Variable *MODULE-PROVIDER-FUNCTIONS*
  The SBCL Manual, Function REQUIRE

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [RETRY                        ] Retry completing load for #<REQUIRE-SYSTEM "sb-sprof">.
  1: [ACCEPT                       ] Continue, treating completing load for #<REQUIRE-SYSTEM "sb-sprof"> as having been successful.
  2:                                 Retry ASDF operation.
  3: [CLEAR-CONFIGURATION-AND-RETRY] Retry ASDF operation after resetting the configuration.
  4: [ABORT                        ] Give up on "cl-yaclyaml"
  5:                                 Exit debugger, returning to top level.

(SB-IMPL::REQUIRE-ERROR "Don't know how to ~S ~A." REQUIRE "sb-sprof")
0] 

或者,如果我尝试:

(require 'sb-sprof)

当 sbcl 以保存的核心启动时,我得到同样的错误。如果 sbcl 像 sbcl 一样启动,则不会报告错误。

实际上,预加载 QUICKLISP 不是问题:如果最初使用 sbcl --no-userinit --no-sysinit 调用 sbcl,也会出现同样的问题。

我做错了吗?

附言。如果我使用 roswell,ros -L sbcl-bin -m core run 不知何故不会拾取图像(通过在保存之前声明变量 *A* 进行测试,并且一旦重新启动就看不到它)。

PS2。到目前为止,sbcl 不提供扩展模块(SB-SPROFSB-POSIX 等),除非在保存图像之前明确要求它们。

【问题讨论】:

  • 也许你想描述问题。例如,通过提供可重现的测试用例和实际错误消息的副本。
  • @RainerJoswig 我已经扩展了这个问题。我希望它能提供更多信息。
  • @jkiiski @RainerJoswig 我发现了问题! SBCL 的核心正在寻找带有额外模块的contrib 目录(包括SB-SPROFSB-POSIX 等)在核心所在的同一目录中。如果它们在保存图像时没有预先加载,SBCL 不会将它们放入图像中。我想知道这是特定 SBCL 版本的行为还是所有版本的行为?
  • 您是否设置了SBCL_HOME 环境变量?
  • 其实我没有。现在我看到(安装说明的第 1.2 节)SBCL 主要在SBCL_HOME 或图像所在的位置查找contrib。谢谢!

标签: common-lisp dump sbcl quicklisp


【解决方案1】:

感谢@jkiiski 的帮助,这里是完整的解释和解决方案:

  1. SBCL 使用并不总是加载到映像中的额外模块(SB-SPROFSB-POSIX 和其他)。这些模块位于contrib 目录中,该目录位于SBCL_HOME 环境变量指向的位置(如果已设置)或图像所在的位置(例如,在/usr/local/lib/sbcl/ 中)。

  2. 当图像保存在另一个位置时,如果没有设置SBCL_HOME,SBCL 将无法找到contrib,因此我看到了错误。

  3. 将 SBCL_HOME 设置为指向contrib 位置(或将contrib 复制到图像位置或将新图像复制到contrib 位置)可以解决问题。

  4. 最后,关于roswell:roswell参数-m搜索特定位置的图片。对于 SBCL (sbcl-bin),它类似于 ~/.roswell/impls/x86-64/linux/sbcl-bin/1.3.7/dump/。其次,SBCL 的图像名称必须采用&lt;name&gt;.core 的形式。要启动它,请使用:ros -m &lt;name&gt; -L sbcl-bin run。 (快速编辑:更好地使用 ros dump 来使用 roswell 保存图像,正如我指出的那样)

【讨论】:

  • 对我有用的是export SBCL_HOME=/usr/lib/sbcl/(由(sb-int:sbcl-homedir-pathname)而不是/usr/local/bin打印的那个)。
【解决方案2】:

如果您想创建可执行文件,可以尝试以下操作:

(sb-ext:save-lisp-and-die “核” :压缩吨 ;;这是主要功能: :顶层(λ() (打印“地狱世界”) 0) :可执行t)

有了这个,您应该可以随意拨打QUICKLOAD。也许您想查看我对 CL-PROJECT 的扩展以创建可执行文件:https://github.com/ritschmaster/cl-project

【讨论】:

  • :COMPRESSION 不适用于我的(不支持 zlib 构建)。我现在不想要独立的可执行文件。我希望 sbcl 进入 REPL,添加顶层函数使其执行并退出 sbcl。
猜你喜欢
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
  • 2015-09-30
  • 2016-10-27
  • 2010-10-17
  • 1970-01-01
相关资源
最近更新 更多