Lisp可执行文件

59

我刚开始学习Lisp,但不知道如何将代码编译和链接为可执行文件。

我正在使用clispclisp -c命令会生成两个文件:

  • .fas
  • .lib

接下来该怎么做才能得到一个可执行文件呢?


你可以使用 compile-file 代替。 - Spenser Truex
6个回答

48

我今天实际上在尝试做这件事情,我发现在CLisp REPL中输入以下内容可以实现:

(EXT:SAVEINITMEM "executable.exe"
                 :QUIET t
                 :INIT-FUNCTION 'main
                 :EXECUTABLE t
                 :NORC t)

其中,main是程序启动时要调用的函数名称,:QUIET t可以抑制启动画面,:EXECUTABLE t可以生成本地可执行文件。

另外,调用下列命令也可能会有帮助:

(EXT:EXIT)

在主函数结尾处添加(quit)以防止程序结束后用户得到交互式lisp提示符。
编辑:阅读文档,您可能还想添加:NORC t(阅读link)。这将抑制加载RC文件(例如~/.clisprc.lisp)。

在Mac OS X 10.9上,我在使用CCL时遇到了创建可执行文件的问题。 (save-application "/full/path/to/saved-app" :prepend-kernel t) 双击生成的可执行文件后,终端会显示非常长的错误信息,以一个类似于“error: problems loadiing bundle:can't determine class name”的错误开始,并以内核调试器选项结束。在Windows上使用CCL时,我只需定义一个函数并执行上述操作以保存可执行文件,稍后我可以双击输出文件运行并记住我的定义函数,但是在Mac上使用CCL时不会记住,即使我保存图像并手动将其加载到内核中。 - sçuçu

36

这是一个稍作修改的Lisp FAQ:

*** 如何从我的程序制作可执行文件?

这取决于您所使用的实现,您需要查阅供应商的文档。

  • 使用ECL和GCL,标准编译过程将生成本机可执行文件。

  • 使用LispWorks,请参见文档中的“交付用户指南”部分。

  • 使用Allegro Common Lisp,请参见手册中的“交付”部分。

  • 等等...

然而,与Common Lisp程序的经典交互方式不涉及独立的可执行文件。在开发过程的两个阶段考虑这一点:编程和交付。

编程阶段:Common Lisp的开发更具有增量感,而不像批处理语言那样常见的是编辑-编译-链接循环。CL开发人员会在REPL(或Read-Eval-Print-Loop,也称为listener)中运行简单测试和瞬态环境交互。源代码保存在文件中,并在类似于ASDF的系统描述设施中记录源文件之间的构建/加载依赖关系(这在编辑-编译-链接系统中扮演类似于make的角色)。该系统描述设施提供用于构建系统(仅重新编译其依赖关系自上次构建以来发生更改的文件)和将系统加载到内存中的命令。

大多数Common Lisp实现也提供了“save-world”机制,可以将当前Lisp映像的快照保存下来,以便以后重新启动。Common Lisp环境通常由一个相对较小的可执行运行时和一个包含一组库和应用程序的图书馆集合组成。

交付阶段:通常,CL程序被交付为包含所有必需的库和应用程序的软件包。这些包可以通过各种方式分发和安装,例如二进制发行版、源代码发行版或网络下载。

更大的图像文件,包含 Lisp 世界的状态。这个功能的常见用途是倾倒一个定制的图像,其中包含给定项目中使用的所有构建工具和库,以减少启动时间。例如,在 CMUCL 中,此功能可用作 EXT:SAVE-LISP,在 SBCL 中为 SB-EXT:SAVE-LISP-AND-DIE,在 CLISP 中为 EXT:SAVEINITMEM,在 OpenMCL 中为 CCL:SAVE-APPLICATION。这些实现大多数可以将运行时前置到映像中,从而使它成为可执行文件。

应用程序交付:与其为应用程序生成单个可执行文件,Lisp 开发人员通常保存包含其应用程序的映像,并将其与运行时一起提供给客户端,可能还有一个 shell 脚本包装器,它使用应用程序映像调用运行时。在 Windows 平台上,可以通过使用类似于 click-o-matic InstallShield 的工具来隐藏这一点。


14

14

3
为了以一种便携的方式实现这个功能,我建议使用roswell
对于任何支持的实现,您可以创建Lisp脚本来运行程序,在可移植的方式下通过ros运行,类似于Python或Ruby程序中的哈希-邦行。
对于SBCL和CCL,roswell还可以使用ros dump executable创建二进制可执行文件。

-1
我知道这是一个旧问题,但我正在查看的Lisp代码已经有25年了 :-)
我无法在Windows 10上使用clisp进行编译。 但是,我用gcl成功地进行了编译。
如果我的Lisp文件是jugs2.lisp,
gcl -compile jugs2.lisp

如果 jugs2.lisp 文件没有错误,则会生成 jugs2.o 文件。

不带参数运行 gcl 以启动 lisp 解释器:

gcl

加载 .o 文件:

(load "jugs2.o")

创建一个EXE文件:
(si:save-system "jugs2")

当运行EXE时,需要DLL oncrpc.dll;它位于<gcl安装文件夹>\lib\gcl-2.6.1\unixport文件夹中,该文件夹由gcl.bat创建。

运行后会显示一个Lisp环境,调用(main)来运行主函数(main)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接