13

如果我想为我的程序创建一个 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 时使用sbcl --no-userinit --no-sysinit.

我做错了吗?

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

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

4

2 回答 2

9

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

  1. SBCL 使用并不总是加载到映像中的额外模块( 和其他模块)SB-SPROFSB-POSIX这些模块位于环境变量指向的contrib目录SBCL_HOME(如果已设置)或图像所在的目录中(例如, in /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 dumproswell 来保存图像,正如向我指出的那样)

于 2016-08-25T14:55:39.377 回答
3

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

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

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

于 2016-08-25T11:49:53.000 回答