VC6编译方法: 1.http://www.openssl.org/source/old/0.9.x/ 下载0.9.x版本 -- VC6不能完全编译最新的1.0.x,所以尽量选择0.9.x 2.安装ActivePerl 3.cmd命令运行 VC6安装目录VC98BinVCVARS32.BAT 4.以此执行下面命令
代码语言:javascript复制perl Configure VC-WIN32
msdo_ms
nmake -f msntdll.mak // 动态库编译
nmake -f msnt.mak // 静态库编译
VS2012 x64 编译方法: 1.下载openssl源代码 http://www.openssl.org/source/ ,我这里下载了最新版 openssl-1.0.1j 2.安装ActivePerl 3.开始应用程序Visual Studio 2012Visual Studio Tools打开 VS2012 x64 本机工具命令提示 4.cd openssl-1.0.1j,然后执行以下命令
代码语言:javascript复制perl Configure VC-WIN64A
msdo_win64a
nmake -f msntdll.mak // 动态编译
nmake -f msnt.mak // 静态编译
cd out32dll
..mstest
x86编译方法: 第3步改为 开始应用程序Visual Studio 2012Visual Studio ToolsVS2012 x86 本机工具命令提示 第4步命令改为: cd openssl-1.0.1j,然后执行以下命令
代码语言:javascript复制perl Configure VC-WIN32
msdo_ms
nmake -f msntdll.mak // 动态编译
nmake -f msnt.mak // 静态编译
cd out32dll
..mstest
最后动态编译生成出来的文件在out32dll目录下、静态编译出来的在out32目录下
一些错误以及解决方法(vs2010为例)
错误: tmp32sha1-586.asm(1432) : error A2070:invalid instruction operands 解决:禁用汇编即可 perl Configure VC-WIN32 no-asm 错误: D:openssl-1.0.2jtmp32e_os.h(288) : fatal error C1083: 无法打开包括文件:“wins ock2.h”: No such file or directory NMAKE : fatal error U1077: “"D:Visual Studio 2010 UltimateVCBINcl.EXE"”: 返回代码“0x2” Stop. 解决: 查看下include环境变量 echo %include% D:Visual Studio 2010 UltimateVCINCLUDE;D:Visual Studio 2010 UltimateVCATLMFCINCLUDE;PlatformSDKinclude; 添加VS2010的include路径: set include=%include%;C:Program Files (x86)Microsoft SDKsWindowsv7.0AInclude 错误: LINK : fatal error LNK1181: 无法打开输入文件“ws2_32.lib” NMAKE : fatal error U1077: “"D:Visual Studio 2010 UltimateVCBINlink.EXE"” 解决: 查看下lib环境变量 echo %lib% D:Visual Studio 2010 UltimateVCLIB;D:Visual Studio 2010 UltimateVCATLMFCLIB;PlatformSDKlib; 添加VS2010的lib路径: set lib=%lib%;C:Program Files (x86)Microsoft SDKsWindowsv7.0ALib 参考文献:https://www.apachelounge.com/viewtopic.php?t=6690 错误: rc /fo"tmp32dlllibeay32.res" /d CRYPTO msversion32.rc 'rc' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 NMAKE : fatal error U1077: “rc”: 返回代码“0x1” Stop. 解决: set path=%path%;D:Visual Studio 2010 UltimateMicrosoft SDKs Windowsv7.0Abin 参考文献:https://www.apachelounge.com/viewtopic.php?t=6690
用Vs2005编译的openssl,在vs2015中使用就悲剧了,报如下错误
代码语言:javascript复制1>libeay32.lib(cryptlib.obj) : error LNK2019: 无法解析的外部符号 __vsnprintf,该符号在函数 _OPENSSL_showfatal 中被引用
1>libeay32.lib(cryptlib.obj) : error LNK2019: 无法解析的外部符号 _vfprintf,该符号在函数 _OPENSSL_showfatal 中被引用
1>libeay32.lib(cryptlib.obj) : error LNK2019: 无法解析的外部符号 ___iob_func,该符号在函数 _OPENSSL_showfatal 中被引用
1>libeay32.lib(pem_lib.obj) : error LNK2001: 无法解析的外部符号 ___iob_func
1>libeay32.lib(rsa_sign.obj) : error LNK2001: 无法解析的外部符号 ___iob_func
1>libeay32.lib(ui_openssl.obj) : error LNK2001: 无法解析的外部符号 ___iob_func
解决方案如下
代码语言:javascript复制#ifdef WIN32
#pragma comment(lib,"User32.lib")
#pragma comment(lib,"Advapi32.lib")
#pragma comment(lib,"Gdi32.lib")
#pragma comment(lib,"legacy_stdio_definitions.lib")
#pragma comment(lib,"libeay32.lib")
#pragma comment(lib,"ssleay32.lib")
#endif
#if _MSC_VER>=1900
#include "stdio.h"
_ACRTIMP_ALT FILE* __cdecl __acrt_iob_func(unsigned);
#ifdef __cplusplus
extern "C"
#endif
FILE* __cdecl __iob_func(unsigned i) {
return __acrt_iob_func(i);
}
#endif /* _MSC_VER>=1900 */