Windows下编译 32位和64位 OpenSSL 2016-04-12

来源:互联网 发布:软件外包人员保密协议 编辑:程序博客网 时间:2024/05/22 14:22

今天由于项目需要,需要编译一个OPENSSL,之前虽然也编译过,但是今天整理下,做个备份,以便日后需要。

  1. 首先下载源码 https://www.openssl.org/source/ 下载openssl-1.0.1p.tar.gz网页
  2. 下载解压到一个目录,最好是英文路径,我的例子D:\opensslsrc32\openssl-1.0.1p这里写图片描述
  3. http://www.activestate.com/activeperl 下载安装 Activestate Perl
  4. 安装vs2013,现在我用的是最新的vs2013 以前2005也编译过,应该差不多
  5. 配置好环境变量,参考设置 C:\Perl\site\bin;C:\Perl\bin;C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin;C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE
  6. 下面开始编译
    1. 首先运行cmd 进入C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin,运行vcvars32,这个一定要先执行,不然后来会报错一些.h找不到这里写图片描述
    2. 进入openssl安装目录,依次执行以下命令
      perl Configure VC-WIN32 –prefix=C:\opensslbuild32
      ms\do_ms
      nmake -f ms\nt.mak
      nmake -f ms\nt.mak install
      nmake -f ms\ntdll.mak
      nmake -f ms\ntdll.mak install

这里写图片描述

这里写图片描述

  1. 如果编译成功,最后的输出都在out32dll目录下:包括可执行文件、两个dll和两个lib文件: libeay32.dll, libeay32.lib, ssleay32.dll, ssleay32.lib

    64位版本的编译,和32位差不多
    1.设置环境变量,C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64
    运行cmd,进入C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64,运行vcvars64.bat。
    2.进入d:盘 openssl目录
    这里写图片描述
    依次执行以下命令
    perl Configure VC-WIN64A –prefix=C:\opensslbuild64
    ms\do_win64a
    nmake -f ms\ntdll.mak clean
    nmake -f ms\ntdll.mak
    nmake -f ms\nt.mak clean
    nmake -f ms\nt.mak

这里写图片描述

我在链接OpenSSL的静态函数库时遇到类似以下的问题:
Linking… msvcrt.lib(MSVCRT.dll) : error LNK2005: _strchr already defined in libcmtd.lib(strchr.obj)

这是由于OpenSSL的静态函数库使用的是了VC的多线程DLL的Release版本,而我的程序使用了多线程静态链接的Release版本。调整OpenSSL的静态函数库使用的库函数版本即可,调整过程如下:

编辑文件 ms\nt.mak,将该文件第19行
“CFLAG= /MD /Ox /O2 /Ob2 /W3 /WX /Gs0 /GF /Gy /nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -D_CRT_SECURE_NO_DEPRECATE-D_CRT_NONSTDC_NO_DEPRECATE /Fdout32 -DOPENSSL_NO_CAMELLIA -DOPENSSL_NO_SEED -DOPENSSL_NO_RC5 -DOPENSSL_NO_MDC2 -DOPENSSL_NO_TLSEXT -DOPENSSL_NO_KRB5-DOPENSSL_NO_DYNAMIC_ENGINE” 中的”/MD”修改为”/MT”。然后重新编译安装OpenSSL即可。

四、附录:在VC中对C/C++ 运行时库不同版本编译指令说明
《在VC中对C/C++ 运行时库不同版本编译指令说明》(http://blog.yesky.com/271/dgkang/1737771.shtml)一文中详细介绍了连接不同版本库的编译指令如下:
C Runtime Library:
/MD MSVCRT.LIB 多线程DLL的Release版本
/MDd MSVCRTD.LIB 多线程DLL的Debug版本
/MT LIBCMT.LIB 多线程静态链接的Release版本
/MTd LIBCMTD.LIB 多线程静态链接的Debug版本
/clr MSVCMRT.LIB 托管代码和非托管代码混合
/clr:pure MSVCURT.LIB 纯托管代码
C++ Standard Library:
/MD MSVCPRT.LIB 多线程DLL的Release版本
/MDd MSVCPRTD.LIB 多线程DLL的Debug版本
/MT LIBCPMT.LIB 多线程静态链接的Release版本
/MTd LIBCPMTD.LIB 多线程静态链接的Debug版本

ms/ntdll.mak ms/nt.mak
14行可以修改输出路径 对于nmake -f ms\ntdll.mak install nmake -f ms\nt.mak install 命令
INSTALLTOP=\usr\local\ssl
OPENSSLDIR=\usr\local\ssl
1. 参考文档http://blog.chinaunix.net/uid-20479991-id-216269.html http://blog.csdn.net/dragoo1/article/details/22398473 http://www.jerryrw.com/howtocompile.php http://blog.csdn.net/pony_maggie/article/details/8588888
http://blog.csdn.net/xhydra/article/details/12517135

0 0
原创粉丝点击