zoukankan      html  css  js  c++  java
  • [转]VC6.0中编译和使用OpenSSL的过程

    一、编译并安装OpenSSL

    1、按照标准步骤从源代码编译安装OpenSSL
        在编译OpenSSL前,需要正确安装Perl,因为在编译OpenSSL时需要使用到该程序。
      
        下载最新版本的Perl:http://downloads.activestate.com/ActivePerl/Windows/。然后安装之。

        下载最新版本的OpenSSL:http://www.openssl.org/source/
      
        然后将源码解压缩到某个目录(如 C:\openssl-0.9.8j)中。
      
        进入openssl源码目录。
        cd c:\openssl-0.9.8.j
       
        以下为参照该目录下的文件INSTALL.W32的执行过程:

        运行configure:
        perl Configure VC-WIN32 --prefix=c:/openssl

        创建Makefile文件:
        ms\do_ms
      
        编译动态库:
        nmake -f ms\ntdll.mak
        编译静态库:
        nmake -f ms\nt.mak

        测试动态库:
        nmake -f ms\ntdll.mak test
        测试静态库:
        nmake -f ms\nt.mak test

        安装动态库:
        nmake -f ms\ntdll.mak install
        安装静态库:
        nmake -f ms\nt.mak install

        清除上次动态库的编译,以便重新编译:
        nmake -f ms\ntdll.mak clean
        清除上次静态库的编译,以便重新编译:
        nmake -f ms\nt.mak clean

    2、如果嫌麻烦,不想编译,可以直接用别人做好的windows OpenSSL 安装包(我用的是0.9.8j版),
       可以从 http://www.slproweb.com/products/Win32OpenSSL.html 下载 OpenSSL for Windows,直接安装。

    P.S. OpenSSL for Windows 的源代码有一些数据类型和VC6的编译器不兼容,我发现的不兼容的数据类型如下:
      在OpenSSL安装目录的下的include/bn.h文件中,将
        #define BN_ULLONG unsigned long long
        #define BN_ULONG unsigned long long
        #define BN_LONG long long
        分别修改为:
        #define BN_ULLONG ULONGLONG
        #define BN_ULONG ULONGLONG
        #define BN_LONG LONGLONG

        否则,会出现编译错误。


    二、使用OpenSSL

        在VC中配置使用以上的函数库:
        点击菜单:Tools -> Options,弹出对话框"Options",在该对话框中选择"Directories"标签。
        在"Show directories for:"的"Include files"选项中新增目录"C:\openssl\include";
          "Library files"选择中新增目录"C:\openssl\lib"。

        然后在需要链接OpenSSL函数库的工程中加入如下两句:
        #pragma comment(lib, "ssleay32.lib")
        #pragma comment(lib, "libeay32.lib")
        其作用是将OpenSSL所需的库导入工程中。

    三、问题

        我在链接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版本


     来自:

    http://blog.163.com/guoguanfei/blog/static/55583037200921810413979/

  • 相关阅读:
    bzoj 1030 [JSOI2007]文本生成器
    Swift 学习笔记 (闭包)
    Swift 学习笔记 (函数)
    HTML 学习笔记 JQueryUI(Interactions,Widgets)
    HTML 学习笔记 JQuery(表单,表格 操作)
    HTML 学习笔记 JQuery(animation)
    HTML 学习笔记 JQuery(盒子操作)
    HTML 学习笔记 JQuery(事件)
    HTML 学习笔记 JQuery(DOM 操作3)
    HTML 学习笔记 JQuery(DOM 操作2)
  • 原文地址:https://www.cnblogs.com/answer/p/1585545.html
Copyright © 2011-2022 走看看