2

我是 CL 新手,我不知道如何从我的简单项目中构建二进制文件。

我创建了app.asd包含以下内容的文件:

(asdf:defsystem game
  :version "0.0.1"
  :components ((:file "package")
               (:file "main")))

package.lisp内容

(defpackage :app 
  (:use :common-lisp :asdf) 
  (:export :start))

main.lisp

(in-package :app)

(defun start (args)
  (format t "Hello"))

我也符号链接app.asd~/quicklisp/quicklisp/app.asd, 当我执行

(require 'asdf)
(asdf:operate 'asdf:load-op :app)

它看起来像是在编译,但我在任何地方都找不到二进制文件/目标文件。

如何构建我的项目,以便可以将其复制到另一台没有安装和运行 CL 的机器上?

我在 osx 上使用 sbcl 1.1.13 和 asdf 3.0.2。

4

1 回答 1

9

不要将 .asd 文件放入~/quicklisp/quicklisp/. 改为使用~/quicklisp/local-projects/

start你的defun的语法是错误的。它需要一个 lambda 列表。

Common Lisp 通常通过启动环境、加载应用程序、然后交互调用应用程序定义的函数来使用。加载过程将源代码编译为机器代码,交互调用的函数是编译函数。

当我想制作一个可以从命令行运行的二进制文件时,我使用buildapp。在您的情况下,您可以执行以下操作:

sbcl --no-userinit --no-sysinit --non-interactive --load ~/quicklisp/setup.lisp \
  --eval '(ql:write-asdf-manifest-file "systems.txt")'

buildapp --manifest-file systems.txt \
  --manifest-file ~/quicklisp/local-projects/system-index.txt \
  --load-system game \
  --entry app::start \
  --output game

在此方案中,您必须修改app::start以接受一个参数,一个包含所有传递给的命令行参数字符串的列表game

一般来说,大多数 Common Lisps 都有一些方法可以生成独立于正常运行时运行的二进制程序。术语各不相同,但通常称为“交付”。如果您将来使用不同的 Common Lisp,则在搜索文档以获取有关交付的信息时可能会获得更多信息。

于 2013-12-14T13:43:50.233 回答