我刚刚开始学习Lisp,我无法弄清楚如何编译和链接lisp代码到可执行文件。
我正在使用clisp
和clisp -c
生成两个文件:
接下来我要做什么来获取可执行文件?
我今天真的试图这样做,我发现在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
(阅读link)。这会抑制加载RC文件(例如,~/.clisprc.lisp
)。
这是一个Lisp FAQ(稍微改编):
***如何从我的程序中生成可执行文件?
这取决于您的实施;您需要查阅供应商的文档。
- 使用ECL和GCL,标准编译过程将生成本机可执行文件。
- 使用LispWorks,请参阅文档的“交付用户指南”部分。
- 使用Allegro Common Lisp,请参阅本手册的“交付”部分。
- 等等...
但是,与Common Lisp程序交互的经典方法不涉及独立的可执行文件。让我们在开发过程的两个阶段考虑这一点:编程和交付。
编程阶段:与面向批处理的语言相比,Common Lisp开发具有更多的增量感,其中编辑 - 编译 - 链接循环很常见。 CL开发人员将在REPL(或Read-Eval-Print-Loop,也称为监听器)上运行与环境的简单测试和瞬态交互。源代码保存在文件中,源文件之间的构建/加载依赖关系记录在系统描述工具中,例如ASDF(在编辑 - 编译 - 链接系统中扮演类似的角色)。系统描述工具提供用于构建系统的命令(并且仅重新编译自上次构建以来依赖性已经改变的文件),以及用于将系统加载到存储器中的命令。
大多数Common Lisp实现还提供了“保存世界”机制,可以以稍后可以重新启动的形式保存当前lisp图像的快照。 Common Lisp环境通常包含一个相对较小的可执行运行时,以及一个包含lisp世界状态的较大图像文件。此工具的一个常见用途是转储包含在给定项目上使用的所有构建工具和库的自定义映像,以减少启动时间。例如,该设施在CMUCL中名为EXT:SAVE-LISP,在SBCL中为SAVE-LISP-AND-DIE,在CLISP中为EXT:SAVEINITMEM,在OpenMCL中为CCL:SAVE-APPLICATION。这些实现中的大多数可以将运行时预先添加到映像,从而使其可执行。
应用程序交付:Lisp开发人员通常不会为应用程序生成单个可执行文件,而是保存包含其应用程序的映像,并将其与运行时一起交付给客户端,并且可能是使用应用程序映像调用运行时的shell脚本包装器。在Windows平台上,可以使用click-o-matic InstallShield类型工具向用户隐藏它。
看一下官方的clisp主页。有一个FAQ来回答这个问题。
CLiki也有一个很好的答案:Creating Executables
对于便携式方法,我推荐roswell。
对于任何支持的实现,您可以创建lisp脚本来运行可以通过ros
以可移植方式运行的程序,该程序可以在hash-bang行中使用,类似于python或ruby程序。
对于SBCL和CCL,roswell还可以使用ros dump executable
创建二进制可执行文件。
我知道这是一个老问题,但我正在看的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函数(main)。