如何编译 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 编译,终于节省了购买正版的开销。