Как правильно сохранить общее изображение Lisp с помощью SBCL?
если я хочу создать 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]
альтернативно, если I попробуйте:
(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-SPROF
, SB-POSIX
, etc.) если они явно не требуются до сохранения изображения.
2 ответов
Спасибо за помощь от @jkiiski вот полное объяснение и решение:
SBCL использует дополнительные модули (
SB-SPROF
,SB-POSIX
и другие), которые не всегда загружаются в изображение. Эти модули находятся вcontrib
каталог расположен либо гдеSBCL_HOME
указывающая переменная среды (если она установлена) или где находится изображение (например, в/usr/local/lib/sbcl/
).когда изображение сохраняется в другом месте и если
SBCL_HOME
- это не set, SBCL не сможет найтиcontrib
, отсюда ошибки, которые я видел.установка SBCL_HOME для указания на
contrib
местоположение (или копированиеcontrib
на месте изображения или изображениеcontrib
location) решает проблему.наконец, о 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, как мне было указано)
Если вы хотите создать исполняемые файлы, вы можете попробовать следующее:
(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