我是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。
最佳答案
不要将.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,则如果您在文档中搜索有关交付的信息,则可能会获得更多信息。