使用Clozure Common Lisp编译二进制文件

24

给定以下简单的程序,你将如何操作:

  1. compile it as a seperate image file to be loaded by the implementation, and what command line arguments would you use to load it?

  2. Compile it as a standalone binary that can be loaded and run as is.

    Note: I tried adding ":prepend-kernel t" when saving the application only to have the follow error thrown.

    Error: value NIL is not of the
    expected type REAL. While executing: 
    CCL::<-2, in process Initial(0).
    
  3. How would you supress the welcome message?

    The Program

    (defun main ()
      (format t "This is the program.")0)
    

编辑

很不情愿地回答自己的问题,但我还是找到了答案。

在函数加载后,键入以下内容进行编译:

(ccl:save-application "app")

这将创建一个图像文件。通过将其传递给实现类型来加载它(注意:'ccl'二进制文件在我的系统路径中);

ccl -I app

要运行顶级函数,请将其作为参数传递。
ccl -I app --eval (main)
1个回答

32

请参阅Clozure Common Lisp文档中的应用程序保存章节。

编译和加载Lisp文件

您可以通过调用以下命令来编译名为/foo/bar.lisp的文件:

 (compile-file "/foo/bar.lisp")

这将创建一个包含本地代码的fasl(FASt Load)文件。您可以使用函数LOAD加载编译后的文件,即fasl文件。 LOADCOMPILE-FILE是标准的Common Lisp函数。 创建应用程序 一些定义:
  • CCL内核:提供低级运行时服务(如内存管理)的CCL部分。
  • 图像:Lisp堆的保存转储
  • 应用程序:CCL内核+图像。这可以在一个文件中完成。
您可以通过调用CCL特定的函数来保存应用程序:
(save-application "/foo/bar-image" :toplevel-function #'main)

这将保存一张图片,您可以使用CCL内核从命令行运行:

ccl -I /foo/bar-image

要保存包含内核的可执行文件,请使用以下Lisp代码:

(save-application "/foo/bar-app"
                  :toplevel-function #'main
                  :prepend-kernel t)

你可以像往常一样从命令行中使用/foo/bar-app调用此可执行文件。
在Clozure Common Lisp中,你可以检查。
*command-line-argument-list*

请参考提供的命令行参数列表。


修正了错误。此外,应用程序按预期创建,但当我尝试加载exe时,出现错误消息告诉我“程序太大,无法适应内存”。你以前遇到过这种情况吗?知道如何解决吗? - BlueBadger
请使用prepend-kernel将内核添加到文件中。 - Rainer Joswig
我在他们的Windows实现上进行了所有这些测试,遇到了所述的各种错误。我刚在Linux机器上测试过,一切正常。谢谢。 - BlueBadger
请确保您在Windows上安装了最新版本的CCL(从存储库更新)。如果这样仍然无法解决问题,请毫不犹豫地在CCL邮件列表或其错误跟踪器上报告此问题。 - Rainer Joswig
顶部的“保存应用程序”链接不正确或已过期。 - Faheem Mitha
@Faheem Mitha:已修复,但由于链接包含章节编号,因此很可能会再次出现问题。 - Rainer Joswig

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