在 Windows 10 x64 上使用 VS 2013 编译 64 位的 GmSSL 的时候出现以下错误:

 

ssl\statem\statem_gmtls.c(1387) : error C2449: 在文件范围内找到“{”(是否缺少函数头?)
ssl\statem\statem_gmtls.c(1485) : error C2059: 语法错误:“}”

NMAKE : fatal error U1077: “C:\MyProgramFiles\VS2013\VC\BIN\x86_amd64\cl.EXE”: 返回代码“0x2”

如下所示:

 

        cl  /I "." /I "include" -DOPENSSL_USE_APPLINK -DDSO_WIN32 -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DPADLOCK_ASM -DGMI_ASM -DPOLY1305_ASM "-DENGINESDIR=\"C:\\Program Files\\GmSSL\\lib\\engines-1_1\"" "-DOPENSSLDIR=\"C:\\Program Files\\Common Files\\SSL\"" -W3 -wd4090 -Gs0 -GF -Gy -nologo -DOPENSSL_SYS_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -D_CRT_SECURE_NO_DEPRECATE -DUNICODE -D_UNICODE /MD /O2 /Zi /Fdossl_static -c /Fossl\statem\statem_gmtls.obj "ssl\statem\statem_gmtls.c"
statem_gmtls.c
ssl\statem\statem_gmtls.c(237) : warning C4267: “=”: 从“size_t”转换到“int”,可能丢失数据
ssl\statem\statem_gmtls.c(282) : warning C4267: “函数”: 从“size_t”转换到“long”,可能丢失数据
ssl\statem\statem_gmtls.c(476) : warning C4267: “=”: 从“size_t”转换到“int”,可能丢失数据
ssl\statem\statem_gmtls.c(528) : warning C4244: “+=”: 从“__int64”转换到“int”,可能丢失数据
ssl\statem\statem_gmtls.c(604) : warning C4244: “=”: 从“__int64”转换到“int”,可能丢失数据
ssl\statem\statem_gmtls.c(659) : warning C4267: “函数”: 从“size_t”转换到“unsigned int”,可能丢失数据
ssl\statem\statem_gmtls.c(892) : warning C4267: “函数”: 从“size_t”转换到“unsigned int”,可能丢失数据
ssl\statem\statem_gmtls.c(980) : warning C4267: “+=”: 从“size_t”转换到“int”,可能丢失数据
ssl\statem\statem_gmtls.c(1005) : warning C4267: “=”: 从“size_t”转换到“int”,可能丢失数据
ssl\statem\statem_gmtls.c(1010) : warning C4267: “-=”: 从“size_t”转换到“int”,可能丢失数据
ssl\statem\statem_gmtls.c(1058) : warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
ssl\statem\statem_gmtls.c(1231) : warning C4267: “函数”: 从“size_t”转换到“unsigned int”,可能丢失数据
ssl\statem\statem_gmtls.c(1387) : error C2449: 在文件范围内找到“{”(是否缺少函数头?)
ssl\statem\statem_gmtls.c(1485) : error C2059: 语法错误:“}”
ssl\statem\statem_gmtls.c(1585) : warning C4013: “gmtls_sm2_derive”未定义;假设外部返回 int
ssl\statem\statem_gmtls.c(1637) : warning C4267: “函数”: 从“size_t”转换到“int”,可能丢失数据
ssl\statem\statem_gmtls.c(1676) : warning C4267: “=”: 从“size_t”转换到“int”,可能丢失数据
ssl\statem\statem_gmtls.c(1785) : warning C4267: “函数”: 从“size_t”转换到“int”,可能丢失数据
ssl\statem\statem_gmtls.c(1823) : warning C4267: “=”: 从“size_t”转换到“int”,可能丢失数据
ssl\statem\statem_gmtls.c(1943) : warning C4267: “函数”: 从“size_t”转换到“int”,可能丢失数据
ssl\statem\statem_gmtls.c(1964) : warning C4267: “=”: 从“size_t”转换到“int”,可能丢失数据
ssl\statem\statem_gmtls.c(2048) : warning C4267: “函数”: 从“size_t”转换到“int”,可能丢失数据
ssl\statem\statem_gmtls.c(2164) : warning C4013: “gmtls_construct_cke_sm2dhe”未定义;假设外部返回 int
NMAKE : fatal error U1077: “C:\MyProgramFiles\VS2013\VC\BIN\x86_amd64\cl.EXE”: 返回代码“0x2”
Stop.

解决办法:

在使用 nmake 命令的后面加上 /I 选项:

nmake /I

就能够编译通过了(虽然还是会报 error),但是编译出来的可执行文件是可以使用的。

参考:

https://msdn.microsoft.com/en-us/library/dt309377.aspx

 

 

 

 

10-07 19:12