Prerequisite
编译细节
1. 下载ChezScheme
将ChezScheme从github上下载9.4版本到本地并解压
注:如果是编译最新的版本(如9.4.1),则需要依赖vs2015,由于我只安装了vs2013故无法编译此版本的ChezScheme
对于9.4.1版本可以从github上clone
到本地仓库
git clone https://github.com/cisco/ChezScheme.git ChezScheme
2. 配置项目
- 切换目录到ChezScheme,然后执行如下操作
mkdir build %创建build目录
./configure -m=ta6nt
3. 编译
- 设置可执行文件目录
set path=%path%;D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\x86_amd64;D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin;C:\Program Files (x86)\Windows Kits\8.1\bin\x64;C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\x64;C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools
- 设置包含目录
set include=D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include;D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\include;C:\Program Files (x86)\Windows Kits\8.1\Include\um;C:\Program Files (x86)\Windows Kits\8.1\Include\shared;C:\Program Files (x86)\Windows Kits\8.1\Include\winrt;%include%
- 设置库目录
set lib=D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib\amd64;D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\lib\amd64;C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x64;%lib%
- 生成scheme和pettie
cd ta6nt\c
nmake /f Makefile.ta6nt
执行完成上面的命令后可能会出现如下错误
io.c(43) : warning C4013: “snprintf”未定义;假设外部返回 int
stats.c(39) : error C2079: “starting_mono_tp”使用未定义的 struct“timespec”
stats.c(133) : error C2037: “tv_sec”的左侧部分指定未定义的结构/联合“timespec”
stats.c(134) : error C2037: “tv_nsec”的左侧部分指定未定义的结构/联合“timespec”
stats.c(139) : error C2037: “tv_sec”的左侧部分指定未定义的结构/联合“timespec”
stats.c(140) : error C2037: “tv_nsec”的左侧部分指定未定义的结构/联合“timespec”
stats.c(158) : error C2037: “tv_sec”的左侧部分指定未定义的结构/联合“timespec”
stats.c(159) : error C2037: “tv_nsec”的左侧部分指定未定义的结构/联合“timespec”
stats.c(164) : error C2037: “tv_sec”的左侧部分指定未定义的结构/联合“timespec”
stats.c(165) : error C2037: “tv_nsec”的左侧部分指定未定义的结构/联合“timespec”
stats.c(178) : error C2037: “tv_sec”的左侧部分指定未定义的结构/联合“timespec”
stats.c(179) : error C2037: “tv_nsec”的左侧部分指定未定义的结构/联合“timespec”
stats.c(183) : error C2037: “tv_sec”的左侧部分指定未定义的结构/联合“timespec”
stats.c(184) : error C2037: “tv_nsec”的左侧部分指定未定义的结构/联合“timespec”
stats.c(198) : error C2037: “tv_sec”的左侧部分指定未定义的结构/联合“timespec”
stats.c(199) : error C2037: “tv_nsec”的左侧部分指定未定义的结构/联合“timespec”
stats.c(290) : error C2079: “tp”使用未定义的 struct“timespec”
stats.c(293) : warning C4133: “函数”: 从“int *”到“timespec *”的类型不兼容
stats.c(295) : error C2224: “.tv_sec”的左侧必须具有结构/联合类型
stats.c(296) : error C2224: “.tv_nsec”的左侧必须具有结构/联合类型
stats.c(299) : error C2224: “.tv_sec”的左侧必须具有结构/联合类型
stats.c(300) : error C2224: “.tv_nsec”的左侧必须具有结构/联合类型
stats.c(316) : error C2079: “tp”使用未定义的 struct“timespec”
stats.c(318) : warning C4133: “函数”: 从“int *”到“timespec *”的类型不兼容
stats.c(319) : error C2224: “.tv_sec”的左侧必须具有结构/联合类型
stats.c(320) : error C2224: “.tv_nsec”的左侧必须具有结构/联合类型
stats.c(320) : error C2198: “Sinteger”: 用于调用的参数太少
stats.c(409) : error C2039: “tm_gmtoff”: 不是“tm”的成员
.......
这是由于vs2013对于C99的支持并不完善,而vs2015是完整支持C99的,因此对于vs2015而言应该不存在上面的问题。
如果使用的是低于vs2015的vs版本,那么我们可以修改代码来实现
//对于这类错误“warning C4013: “snprintf”未定义;假设外部返回 int”,可以在相应的原文件中添加如下的语句
#define snprintf _snprintf
//对于使用未定义的 struct“timespec”问题,可以自定义此结构体
struct timespec {
time_t tv_sec;
long tv_nsec;
};
//对于“tm_gmtoff”: 不是“tm”的成员,可以暂时将对应的语句注释掉
完成如上的修改之后,我们在重新执行上面的命令,然后就可以将scheme.exe编译好了。