59

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

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

  • .fas
  • .lib

接下来我该怎么做才能获得可执行文件?

4

6 回答 6

48

我今天实际上正在尝试这样做,我发现在 CLisp REPL 中输入它是有效的:

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

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

打电话也很有用

(EXT:EXIT)

在您的主要功能结束时,以阻止用户在程序完成时获得交互式 lisp 提示。

编辑:阅读文档,您可能还想添加:NORC t (阅读链接)。这将禁止加载 RC 文件(例如,~/.clisprc.lisp)。

于 2008-08-24T23:10:00.980 回答
36

这是一个Lisp 常见问题解答(稍作改编):

*** 如何从我的程序中生成可执行文件?

这取决于您的实施;您需要查阅供应商的文档。

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

  • 对于 LispWorks,请参阅文档的交付用户指南部分。

  • 对于 Allegro Common Lisp,请参阅手册的交付部分。

  • ETC...

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

编程阶段:与面向批处理的语言相比,Common Lisp 开发具有更多的增量感觉,其中编辑-编译-链接循环很常见。CL 开发人员将在 REPL(或 Read-Eval-Print-Loop,也称为 侦听器)上运行简单的测试和与环境的瞬态交互。源代码保存在文件中,源文件之间的构建/加载依赖关系记录在系统描述工具中,例如 ASDF(在编辑-编译-链接系统中扮演类似的角色。系统描述工具提供用于构建系统的命令(并且仅重新编译自上次构建以来依赖关系已更改的文件)以及将系统加载到内存中。

大多数 Common Lisp 实现还提供了一种“保存世界”机制,可以保存当前 lisp 图像的快照,以以后可以重新启动的形式。Common Lisp 环境通常由一个相对较小的可执行运行时和一个包含 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 类型工具对用户隐藏。

于 2008-08-27T23:40:49.163 回答
14

看看官方的clisp主页。有一个常见问题解答可以回答这个问题。

http://clisp.cons.org/impnotes/faq.html#faq-exec

于 2008-08-24T13:55:29.113 回答
14

CLiki 也有一个很好的答案:Creating Executables

于 2009-06-25T17:32:51.513 回答
3

对于这样做的便携方式,我推荐roswell

对于任何受支持的实现,您可以创建 lisp 脚本来运行可以以可移植方式运行的程序,通过ros这种方式可以在 hash-bang 行中使用类似于 python 或 ruby​​ 程序。

对于 SBCL 和 CCL,roswell 还可以使用ros dump executable.

于 2015-12-10T06:36:15.503 回答
-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 install folder>\lib\gcl-2.6.1\unixportgcl.bat 创建的文件夹中。

运行时显示 lisp 环境,调用 (main) 运行主函数 (main)。

于 2017-08-26T02:02:05.440 回答