如果我想创建程序的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-SPROF
,SB-POSIX
等),除非在保存图像之前明确要求它们。
答案 0 :(得分:6)
感谢@jkiiski的帮助,这里有完整的解释和解决方案:
SBCL使用并非总是加载到图像中的额外模块(SB-SPROF
,SB-POSIX
和其他模块)。这些模块位于contrib
目录中,位于SBCL_HOME
环境变量指向(如果已设置)或图像所在的位置(例如,在/usr/local/lib/sbcl/
中)。
当图片保存在其他位置且未设置SBCL_HOME
时,SBCL将无法找到contrib
,因此我看到了错误。
将SBCL_HOME设置为指向contrib
位置(或将contrib
复制到图像位置或将新图像复制到contrib
位置)可以解决问题。
最后,关于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