Как правильно сохранить общее изображение 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 вот полное объяснение и решение:

  1. SBCL использует дополнительные модули (SB-SPROF, SB-POSIX и другие), которые не всегда загружаются в изображение. Эти модули находятся в contrib каталог расположен либо где SBCL_HOME указывающая переменная среды (если она установлена) или где находится изображение (например, в /usr/local/lib/sbcl/).

  2. когда изображение сохраняется в другом месте и если SBCL_HOME - это не set, SBCL не сможет найти contrib, отсюда ошибки, которые я видел.

  3. установка SBCL_HOME для указания на contrib местоположение (или копирование contrib на месте изображения или изображение contrib location) решает проблему.

  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, как мне было указано)


Если вы хотите создать исполняемые файлы, вы можете попробовать следующее:

(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