如何使用SBCL正确保存Common Lisp图像?

时间:2016-08-24 21:37:58

标签: common-lisp dump sbcl quicklisp

如果我想创建程序的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,则会出现同样的问题。

我做错了吗?

PS。如果我使用roswell,ros -L sbcl-bin -m core run以某种方式不会获取图像(通过在保存之前声明变量*A*进行测试,并在重新启动后再看不到它)。

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

2 个答案:

答案 0 :(得分:6)

感谢@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的图像名称必须为<name>.core形式。要启动它,请使用:ros -m <name> -L sbcl-bin run。 (快速编辑:更好地使用ros dump使用roswell保存图像,如我所指出的那样)

答案 1 :(得分:1)

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

(sb-ext:save-lisp-and-die 
  "core"
  :compression t
  ;; this is the main function:
  :toplevel (lambda () 
              (print "hell world")                                      
              0)
  :executable t)

有了这个,您应该可以根据需要拨打QUICKLOAD。也许您想要将我的扩展程序签出到CL-PROJECT以创建可执行文件:https://github.com/ritschmaster/cl-project