如何编译CormanLisp

Table of Contents

Corman Lisp是一个运行在Windows平台之上的商业版Common Lisp实现,它支持Win32编程,并能真正把Common Lisp代码编译成独立二进制文件。

最近,Corman Lisp以MIT协议开源在Github上,这绝对是对Common Lisp的一大贡献,因为其他开源的Common Lisp实现都不可以把代码编译成真正的独立二进制文件。

我装了3个Windows平台和3个版本的Visual Studio来编译Corman Lisp的代码,并在此记录我在编译过程以及遇到的问题。

说明:我所使用的Windows均为32位,并运行在VirtualBox中。目前已在以下环境中顺利完成编译:

系统 处理器位数 Visual Studio版本
Windows XP SP3 32 2005
Windows7旗舰版 32 2008
Windows7旗舰版 32 2013
Windows7旗舰版 32 Community 2013

注: Windows8 32位下用VS Community 2013可正常编译,但编译后的 CormanLisp非常不稳定。

1 预备步骤

首先去仓库中下载一份Corman Lisp的源码,仓库地址: https://github.com/sharplispers/cormanlisp

如果你使用的VS版>=2005,编译后的解析器是无法正常执行的,需要修改CormanLispServer/src/Gc.cpp,将3316行代码:

strcpy_s(header.copyright, sizeof(header.copyright), LispImageCopyright);

改为:

strncpy_s(header.copyright, sizeof(header.copyright), LispImageCopyright, _TRUNCATE);

注:此处参考了slahn push的代码,地址为: https://github.com/slahn/cormanlisp/commit/e8896dab1b2b3686001f9f29d30ad1db71d0ad23 ,并且他已向官方申请了代码合并,如果官方合并了他提交的代码,将来就不需要做这一步改动了。

2 VS2005下编译

1、 运行一个CMD,然后:

  1. 进入VS所在目录下的VC文件夹中,(我的VS2005路径为:C:\Program Files\Microsoft Visual Studio 8\VC)
  2. 将vcvarsall.bat拖进CMD中执行
  3. 进入CormanLisp源码文件夹

2、 在CMD中执行makeall.bat,不出意外的话就,CMD会提示:

The file CormanLisp.img was created successfully.

表示成功编译。

9AD479E45AC8078F458C519D34C4ED07.png

这步完成了:

  1. Lisp解析器的编译;
  2. 用生成的Lisp解析器编译了一些Lisp代码;
  3. 导出了一个Lisp镜像文件(CormanLisp.img)。

如果在编译前没按前面说的修改代码,生成镜像文件时会报错并进入VS的调试器。

执行目录下生成的clconsole.exe,不出意外的话会进入Lisp解析器。

0FE30B0C310D5B0D85AB9FF437F3F858.png

3、 目前IDE还没有编译,用VS打开src.sln或src_vc9.sln(具体取决与你安装的VS版本),然后点“生成”->“生成解决方案”。

最后运行编译好的CormanLisp.exe,进入IDE环境。 注:运行IDE必须要有镜像文件CormanLisp.img,所以上面步骤一定要成功

1320C5E3A4C1F4C7C70979F6E4F89934.png

3 VS2008下编译

步骤类似,先修改CormanLispServer/src/Gc.cpp。不过编译过程中我遇到两个问题:

  1. 找不到msvcr90.dll

解决方法:下载一个msvcr90.dll放到C:\WINDOWS\System32中

  1. 出现R6304 Runtime Error

解决方法:1) 用VS2008打开src_vc9.ncb,然后右击“clconsole_vc9” -> “属性”,在属性页的“通用配置” -> “链接器” -> “清单文件”中开启“生成清单”:

B5C302E2AB491E59E9C40C2108EAF7AF.png

接着重新“生成解决方案”即可。最后在运行makeall.bat。

4 VS2013下编译

建议目前直接使用slahn修改后支持VS2013的: https://github.com/slahn/cormanlisp

然后打开工程项目,修改“CormanLisp”的“清单生成”,方法见编译VS2008小节中。

注:

  1. slahn已经向官方仓库申请合并代码了,所以未来可能官方的源码也能使用VS2013直接编译。
  2. 在VS2013下编译IDE会遇到MFC的一些问题,下载一个补丁就可解决: http://www.microsoft.com/en-us/download/details.aspx?id=40770

2015-01-17更新: 我在Visual Studio Community 2013上成功编译了,方法同上。我强烈建议使用 VS Community 2013来编译,因为这是微软开放的免费的社区版,这意味着你可 以不用购买或者盗版一套VS就能名正言顺编译了。

5 打包二进制文件

在Linux/Unix下用make完成编译后,一般都有make install阶段,意味着将编译 好的二进制文件自动分散到系统的相关目录中。

我们编译完CormanLisp后,可以在CMD下直接运行当前目录下的copyrelease,在 参数中指定要将编译后的二进制移到的目标目录即可,如:

copyrelease C:\CormanLisp

6 结尾

目前我已经完成了编译,但还有很多没有测试过,不确定是否有其他问题,比如:

  1. 在64位系统下编译出来的是否有问题
  2. 不同版本的VS生成的CormanLisp是否有问题
  3. Windows7及更高的系统里编译出来的能否很好工作

后面我可能会在Windows下待一段时间,用CormanLisp来尝试具体的Win32编程。

2015-01-19更新: 可以在modern.ie 下载正版的Windows虚拟机镜像,激活后 可以使用90天。目前我在modern.ie上下载Windows,然后用社区版的VS编译, 终于节省了购买正版的开销。