【问题标题】:Lisp ExecutableLisp 可执行文件
【发布时间】:2010-09-06 16:55:42
【问题描述】:

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

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

  • .fas
  • .lib

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

【问题讨论】:

  • 你可以改用compile-file

标签: build lisp common-lisp clisp


【解决方案1】:

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

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

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

调用也很有用

(EXT:EXIT)

在你的 main 函数结束时,以阻止用户在程序完成时获得交互式 lisp 提示。

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

【讨论】:

  • 在 mac os x 10.9 上的 ccl 上,我在创建可执行文件时遇到问题。 (save-application "/full/path/to/saved-app" :prepend-kernel t) 双击生成的可执行文件进入终端,显示非常长的错误,以类似错误开头:加载捆绑时出现问题:无法确定类名并以内核调试器选项结尾。在 Windows 上的 ccl 上,我只需定义一个函数并执行上述相同操作以保存可执行文件,稍后我可以双击它运行的输出文件并记住我定义的函数,mac 上的 ccl 也不记得当我保存图像并将其加载到内核时手动
【解决方案2】:

这是Lisp FAQ(略有改编):

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

这取决于你的实现;您需要咨询您的 供应商的文档。

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

  • 对于 LispWorks,请参阅 Delivery User's Guide 部分 文档。

  • 对于 Allegro Common Lisp,请参阅 Delivery 部分 手册。

  • 等等……

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

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

大多数常见的 Lisp 实现还提供“保存世界”机制 这样就可以保存当前 lisp 图像的快照, 以以后可以重新启动的形式。一个 Common Lisp 环境 通常由一个相对较小的可执行运行时和一个 包含 lisp 世界状态的较大图像文件。普通的 使用此功能是转储包含所有 构建用于给定项目的工具和库,按顺序 以减少启动时间。例如,此设施可在 CMUCL 中的名称 EXT:SAVE-LISP,SB-EXT:SAVE-LISP-AND-DIE 中的名称 SBCL、EXT:SAVEINITMEM 在 CLISP 和 CCL:SAVE-APPLICATION 在 开放式 MCL。这些实现中的大多数都可以将运行时添加到 图像,从而使其可执行。

应用程序交付:而不是生成单个可执行文件 应用程序的文件,Lisp 开发人员通常保存图像 包含他们的应用程序,并将其与客户一起交付给客户 运行时,可能还有一个调用 运行时与应用程序映像。在 Windows 平台上,这可以是 使用 click-o-matic InstallShield 类型工具对用户隐藏。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        要以便携的方式执行此操作,我推荐roswell

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

        对于 SBCL 和 CCL,roswell 还可以使用ros dump executable 创建二进制可执行文件。

        【讨论】:

          【解决方案6】:

          我知道这是一个老问题,但我正在查看的 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.bat 创建的 <gcl install folder>\lib\gcl-2.6.1\unixport 文件夹中。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-04-06
            • 2015-02-28
            • 1970-01-01
            • 1970-01-01
            • 2018-12-29
            • 2022-08-19
            相关资源
            最近更新 更多